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.

Reply via email to