Using simple getters and setters fixed it. The class cast was happening
in the getVotes method as I returned an Vote[]. I never would have
figured that was the cause without help. I did not realize iBATIS was
using the get method the way it was.
That explains why the classcast was happening.
Thanks a bunch.
- Eric
Jeff Butler wrote:
Hmmm...You can't cast a List to an array - so you must have meant
something else - were you calling the toArray() method and saving the
result as an array internally?
In my testing I've observed that iBATIS will call the setVotes method
once with null, once again with an empty ArrayList. Then it will
repeatedly call getVotes for all the remaining votes rows. Note that
iBATIS does not compose the entire List and send it to the setVotes
method at one time. The initial list will be empty, then the getVotes
method will be called repeatedly to add a Vote object one at a time.
You best hope for success is to have a private List of votes, and
simple getters and setters. Trying to do anything wierd in the
setters and getters will cause unpredictable results - like you're seeing.
If you are still having trouble after making simple getters and
setters, then please send your BasicStakeholder class along with your
reply.
Jeff Butler
On 4/18/06, *Eric Bauld* <[EMAIL PROTECTED]
<mailto:[EMAIL PROTECTED]>> wrote:
setVotes was casting to an array. But when I added a if(votes ==
null){return;} for testing or removed all code in the method.
and left it as
setVotes(List votes){}
I would then get this ClassCastException(included below) if the setter
method for setVotes has code in it or not.
Its as if my resultMap for BasicVote is failing. As it would build
the
stakeholder object when I removed the
<result property="votes" resultMap="Stakeholder.votes"/>
from the stakeMap resultMap. I cannot see a problem in my resultMap, I
have looked over it many times.
I am already using the BasicVote object in vote.xml(included
below) and
I can get votes from the DB just fine.
But its not working within stakeholder.xml
--------------Exception trace Follows:
com.ibatis.common.jdbc.exception.NestedSQLException :
--- The error occurred in config/maps/stakeholder.xml.
--- The error occurred while applying a result map.
--- Check the Stakeholder.stakeMap.
--- The error happened while setting a property on the result object.
--- Cause: java.lang.ClassCastException
Caused by: java.lang.ClassCastException
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:610)
at
com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:584)
at
com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForList(SqlMapSessionImpl.java:101)
at
com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForList(SqlMapClientImpl.java:78)
at
rp.broker.StakeholderBroker.getStakeholders(StakeholderBroker.java:81)
at
test.rp.broker.TestStakeholderBroker.testGetStakeholders
(TestStakeholderBroker.java:37)
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:324)
at junit.framework.TestCase.runTest(TestCase.java:154)
at junit.framework.TestCase.runBare(TestCase.java:127)
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:118)
at junit.framework.TestSuite.runTest(TestSuite.java:208)
at junit.framework.TestSuite.run(TestSuite.java:203)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java
:478)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:344)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Caused by: java.lang.ClassCastException
at
com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.setNestedResultMappingValue(BasicResultMap.java:383)
at
com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.applyNestedResultMap(BasicResultMap.java
:369)
at
com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.setResultObjectValues(BasicResultMap.java:355)
at
com.ibatis.sqlmap.engine.mapping.statement.RowHandlerCallback.handleResultObject(RowHandlerCallback.java
:63)
at
com.ibatis.sqlmap.engine.execution.SqlExecutor.handleResults(SqlExecutor.java:395)
at
com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQuery(SqlExecutor.java:185)
at
com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.sqlExecuteQuery
(GeneralStatement.java:205)
at
com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:173)
... 22 more
Caused by:
java.lang.ClassCastException
at
com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.setNestedResultMappingValue(BasicResultMap.java:383)
at
com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.applyNestedResultMap(BasicResultMap.java
:369)
at
com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.setResultObjectValues(BasicResultMap.java:355)
at
com.ibatis.sqlmap.engine.mapping.statement.RowHandlerCallback.handleResultObject(RowHandlerCallback.java
:63)
at
com.ibatis.sqlmap.engine.execution.SqlExecutor.handleResults(SqlExecutor.java:395)
at
com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQuery(SqlExecutor.java:185)
at
com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.sqlExecuteQuery
(GeneralStatement.java:205)
at
com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:173)
at
com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForList
(GeneralStatement.java:123)
at
com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:610)
at
com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java
:584)
at
com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForList(SqlMapSessionImpl.java:101)
at
com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForList(SqlMapClientImpl.java:78)
at
rp.broker.StakeholderBroker.getStakeholders
(StakeholderBroker.java:81)
at
test.rp.broker.TestStakeholderBroker.testGetStakeholders(TestStakeholderBroker.java:37)
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:324)
at junit.framework.TestCase.runTest (TestCase.java:154)
at junit.framework.TestCase.runBare(TestCase.java:127)
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:118)
at junit.framework.TestSuite.runTest(TestSuite.java:208)
at junit.framework.TestSuite.run(TestSuite.java :203)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:478)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:344)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main
(RemoteTestRunner.java:196)
---------Vote.xml-----------
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap
PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"
"http://www.ibatis.com/dtd/sql-map-2.dtd">
<sqlMap namespace="Vote">
<select id="getVotes" resultClass=" rp.object.baseImpl.BasicVote">
SELECT user_id AS userId,
instance_id AS instanceId,
requirement_id AS requirementId,
criteria_id AS criteriaId,
value AS voteValue
FROM vote
WHERE user_id = #userId#
AND instance_id = #instanceId#
</select>
<insert id="insertVotes"
parameterClass="rp.object.baseImpl.BasicVote">
INSERT INTO vote
(user_id,instance_id,requirement_id,criteria_id,value)
VALUES
(#userId#,#instanceId#,#requirementId#,#criteriaId#,#voteValue#)
ON DUPLICATE KEY UPDATE value=#voteValue#;
</insert>
</sqlMap>