iBatis throws a NPE when performing a sub-select in a resultMap. ----------------------------------------------------------------
Key: IBATIS-464 URL: https://issues.apache.org/jira/browse/IBATIS-464 Project: iBatis for Java Issue Type: Bug Components: SQL Maps Affects Versions: 2.3.0, 2.2.0 Environment: WinXP, Java 1.5, originally discovered when moving to Spring 2.0.6 (spring-ibatis depends on ibatis 2.3.0) Reporter: Mitchell L. Waters III Priority: Blocker iBatis throws a NullPointerException when performing a sub-select in a resultMap. For some foo record in the DB, there are a variable number of comments. iBatis allows the user to return an object that contains the information from the foo table and return the list/array/collection of related items (comments in this example) from a separate table that relate to the foo record, using a resultMap like what is listed below. <resultMap class="test.FooDto" id="fooResult"> <result property="foo" column="foo" /> <result property="bar" column="bar" /> <result property="comments" select="getCommentList" column="{foo=foo}" /> </resultMap> This works without a hitch in iBatis 2.1.7. However when you attempt to do the same in iBatis 2.2.0 or 2.3.0, you get a NPE (stack trace to follow). Digging in a bit, it seems that the session returned to do the SessionScope that is returned for the sub-select is different than that used to run the original select (different than the behavior in 2.1.7) and that the transaction/transaction manager for the new SessionScope object is null. It ends up throwing when it attempts to start a new transaction for the sub-select. I originally saw this problem when updating my application to use Spring 2.0.6 (which uses iBatis 2.3.0 as a dependency of the spring-ibatis module), but upon further investigation I was able to isolate it to being in the ibatis-sqlmap module. I've since set up our project to use Spring 2.0.6 with an older version (2.1.7) of iBatis, and this works fine. While testing the problem, we tested iBatis 2.1.7, 2.2.0 and 2.3.0 with both Spring 1.2.9 and 2.0.6, and we only experience the problem with iBatis 2.2.0 and 2.3.0. Hopefully, this will be fixed but until then we will be sticking with 2.1.7. Thank you, Mitch Waters org.springframework.jdbc.UncategorizedSQLException: SqlMapClient operation; uncategorized SQLException for SQL []; SQL state [null]; error code [0]; --- The error occurred in test.xml. --- The error occurred while applying a result map. --- Check the complexResult. --- Check the result mapping for the 'roles' property. --- Cause: java.lang.NullPointerException; nested exception is com.ibatis.common.jdbc.exception.NestedSQLException: --- The error occurred in test.xml. --- The error occurred while applying a result map. --- Check the complexResult. --- Check the result mapping for the 'roles' property. --- Cause: java.lang.NullPointerException Caused by: com.ibatis.common.jdbc.exception.NestedSQLException: --- The error occurred in test.xml. --- The error occurred while applying a result map. --- Check the complexResult. --- Check the result mapping for the 'roles' property. --- Cause: java.lang.NullPointerException at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:188) at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForList(GeneralStatement.java:123) at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:615) at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:589) at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForList(SqlMapSessionImpl.java:118) at org.springframework.orm.ibatis.SqlMapClientTemplate$3.doInSqlMapClient(SqlMapClientTemplate.java:269) at org.springframework.orm.ibatis.SqlMapClientTemplate.execute(SqlMapClientTemplate.java:194) at org.springframework.orm.ibatis.SqlMapClientTemplate.executeWithListResult(SqlMapClientTemplate.java:220) at org.springframework.orm.ibatis.SqlMapClientTemplate.queryForList(SqlMapClientTemplate.java:267) at org.springframework.orm.ibatis.SqlMapClientTemplate.queryForList(SqlMapClientTemplate.java:261) at dbtest.UserDao.queryForList(UserDao.java:23) at dbtest.UserDao.complexQuery(UserDao.java:14) at dbtest.UserDaoTest.testGetComplexUserList(UserDaoTest.java:43) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at junit.framework.TestCase.runTest(TestCase.java:164) at junit.framework.TestCase.runBare(TestCase.java:130) at junit.framework.TestResult$1.protect(TestResult.java:106) at junit.framework.TestResult.runProtected(TestResult.java:124) at junit.framework.TestResult.run(TestResult.java:109) at junit.framework.TestCase.run(TestCase.java:120) at junit.framework.TestSuite.runTest(TestSuite.java:230) at junit.framework.TestSuite.run(TestSuite.java:225) at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196) Caused by: java.lang.NullPointerException at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.endTransaction(SqlMapExecutorDelegate.java:782) at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.endTransaction(SqlMapSessionImpl.java:176) at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.endTransaction(SqlMapClientImpl.java:154) at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.autoEndTransaction(SqlMapExecutorDelegate.java:883) at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:622) at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:589) at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForList(SqlMapSessionImpl.java:118) at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForList(SqlMapClientImpl.java:95) at com.ibatis.sqlmap.engine.mapping.result.loader.ResultLoader.getResult(ResultLoader.java:72) at com.ibatis.sqlmap.engine.mapping.result.loader.ResultLoader.loadResult(ResultLoader.java:59) at com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.getNestedSelectMappingValue(BasicResultMap.java:502) at com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.getResults(BasicResultMap.java:340) at com.ibatis.sqlmap.engine.execution.SqlExecutor.handleResults(SqlExecutor.java:381) at com.ibatis.sqlmap.engine.execution.SqlExecutor.handleMultipleResults(SqlExecutor.java:301) at com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQuery(SqlExecutor.java:190) at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.sqlExecuteQuery(GeneralStatement.java:205) at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:173) ... 30 more -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.