티스토리 뷰

문제의 코드

<select id="getMemberId" resultType="int">
   select
   			member_id
   from
   			member
   where
   			member_id = 1
</select>

현재 member테이블은 아무런 값이 없어 row가 하나도 없어 쿼리를 실행시 아무값도 안나온다.

위의 쿼리로 테스트

@Test
public void getMemberId() {
    int memberId = MemberMapper.selectCount();
    assertEquals(“memberId의 값은? ", 0, memberId);
}

결과

2016-10-04 14:21:55 [DEBUG] [BaseJdbcLogger.java:139] - ==>  Preparing: SELECT member_id FROM member WHERE member_id = 1
2016-10-04 14:21:55 [DEBUG] [BaseJdbcLogger.java:139] - ==> Parameters:
2016-10-04 14:21:55 [DEBUG] [BaseJdbcLogger.java:139] - <==      Total: 0
org.apache.ibatis.binding.BindingException: Mapper method ‘com.member.MemberMapper.selectCount attempted to return null from a method with a primitive return type (int).   
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:74)   
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:52)   
at com.sun.proxy.$Proxy29.selectCount(Unknown Source)   
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)   
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)   
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)   
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)   
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)   
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)   
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)   
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)   
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)   
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)   
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)   
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:254)   
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:89)   
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)   
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)   
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)   
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)   
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)   
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)   
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)   
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)   
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:193)   
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)   
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78)   
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212)   
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68)   
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)   
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)   
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

 

결과에서 보듯이 attempted to return null from a method with a primitive return type (int). 오류를 표출한다.

 

문제는 int형인대 왜 result가 null을 반환을 하는것인가??? 

이문제는 Mybatis에서 제공하는 TypeHandler의 코드를 확인해보자.

public T getResult(ResultSet rs, int columnIndex) throws SQLException {
    Object result = this.getNullableResult(rs, columnIndex);
    return rs.wasNull()?null:result;
}

위 코드를 보면 ResultSet가 null이면 null을 반환하고 null이 아니면 조회해온 값을 반환하게 되어 있다.

 

이와 같은 문제를 해결 할 방법은 resultType를 int = Integer, long = Long로 변경을 하고 소스코드에서 Null처리를 해야 할거 같다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함