[ 
https://issues.apache.org/jira/browse/IBATIS-456?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Clinton Begin closed IBATIS-456.
--------------------------------

       Resolution: Fixed
    Fix Version/s: 2.3.1

> ClassCastException when mapping primitive arrays due to attempts to cast to 
> object arrays made by iBatis
> --------------------------------------------------------------------------------------------------------
>
>                 Key: IBATIS-456
>                 URL: https://issues.apache.org/jira/browse/IBATIS-456
>             Project: iBatis for Java
>          Issue Type: Bug
>          Components: SQL Maps
>    Affects Versions: 2.3.0
>            Reporter: Jonathan Alvarsson
>            Priority: Blocker
>             Fix For: 2.3.1
>
>
> When mapping an array of primitives (at least doubles) iBatis when injecting 
> the array seems to try to cast it to an array of objects which results in 
> something like this:
> org.springframework.jdbc.UncategorizedSQLException: SqlMapClient operation; 
> uncategorized SQLException for SQL []; SQL state [null]; error code [0];   
> --- The error occurred in mapping/MoleculeDescriptor.xml.  
> --- The error occurred while applying a result map.  
> --- Check the MoleculeDescriptor.  
> --- Check the result mapping for the 'values' property.  
> --- Cause: java.lang.ClassCastException: [D; nested exception is 
> com.ibatis.common.jdbc.exception.NestedSQLException:   
> --- The error occurred in mapping/MoleculeDescriptor.xml.  
> --- The error occurred while applying a result map.  
> --- Check the MoleculeDescriptor.  
> --- Check the result mapping for the 'values' property.  
> --- Cause: java.lang.ClassCastException: [D
> Caused by: com.ibatis.common.jdbc.exception.NestedSQLException:   
> --- The error occurred in mapping/MoleculeDescriptor.xml.  
> --- The error occurred while applying a result map.  
> --- Check the MoleculeDescriptor.  
> --- Check the result mapping for the 'values' property.  
> --- Cause: java.lang.ClassCastException: [D
>       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)
> [snipp....]
> Caused by: java.lang.ClassCastException: [D
>       at 
> com.ibatis.sqlmap.engine.mapping.result.loader.ResultLoader.listToArray(ResultLoader.java:85)
>       at 
> com.ibatis.sqlmap.engine.mapping.result.loader.ResultLoader.getResult(ResultLoader.java:75)
>       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)
>       ... 46 more
> Following fix suggested by [EMAIL PROTECTED]:
> ResultLoader.java:
> private static Object listToArray(List list, Class type) {
>   Object array = java.lang.reflect.Array.newInstance(type, list.size());
>   if (type.isPrimitive()) {
>     Iterator iter = list.iterator();
>     int index = 0;
>     while (iter.hasNext()) {
>       Array.set(array, index++, iter.next());
>     }
>   } else {
>     array = list.toArray((Object[]) array);
>   }
>   return array;
> }

-- 
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