You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ibatis.apache.org by "Kai Grabfelder (JIRA)" <ib...@incubator.apache.org> on 2009/05/14 20:32:45 UTC

[jira] Issue Comment Edited: (IBATIS-464) iBatis throws a NPE when performing a sub-select in a resultMap.

    [ https://issues.apache.org/jira/browse/IBATIS-464?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12709510#action_12709510 ] 

Kai Grabfelder edited comment on IBATIS-464 at 5/14/09 11:30 AM:
-----------------------------------------------------------------

What do you mean with similar error message? Please post a stacktrace. Furthermore you should use inject the datasource into the sqlmapclientfactorybean. There should be no need for you to have a datasource in your DAOs

      was (Author: kaig):
    what do you mean oyu get similar error message? Please post a stacktrace. Furthermore you should use inject the datasource into the sqlmapclientfactorybean. There should be no need for you to have a datasource in your DAOs
  
> 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.2.0, 2.3.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.