Author: cbegin
Date: Thu Oct  8 03:34:07 2009
New Revision: 823012

URL: http://svn.apache.org/viewvc?rev=823012&view=rev
Log:
IBATIS-653 foreach does not support collections of complex types

Modified:
    
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/dynamic/ForEachSqlNode.java
    
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/executor/parameter/DefaultParameterHandler.java
    
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/builder/xml/dynamic/DynamicSqlSourceTest.java

Modified: 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/dynamic/ForEachSqlNode.java
URL: 
http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/dynamic/ForEachSqlNode.java?rev=823012&r1=823011&r2=823012&view=diff
==============================================================================
--- 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/dynamic/ForEachSqlNode.java
 (original)
+++ 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/dynamic/ForEachSqlNode.java
 Thu Oct  8 03:34:07 2009
@@ -5,6 +5,8 @@
 import java.util.Map;
 
 public class ForEachSqlNode implements SqlNode {
+  public static final String ITEM_PREFIX = "__frch_";
+  
   private ExpressionEvaluator evaluator;
   private String collectionExpression;
   private SqlNode contents;
@@ -80,10 +82,8 @@
   }
 
   private static String itemizeItem(String item, int i) {
-    return new 
StringBuilder("__").append(item).append("_").append(i).toString();
+    return new 
StringBuilder(ITEM_PREFIX).append(item).append("_").append(i).toString();
   }
-
-
   
   private static class FilteredDynamicContext extends DynamicContext {
     private DynamicContext delegate;

Modified: 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/executor/parameter/DefaultParameterHandler.java
URL: 
http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/executor/parameter/DefaultParameterHandler.java?rev=823012&r1=823011&r2=823012&view=diff
==============================================================================
--- 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/executor/parameter/DefaultParameterHandler.java
 (original)
+++ 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/executor/parameter/DefaultParameterHandler.java
 Thu Oct  8 03:34:07 2009
@@ -3,7 +3,9 @@
 import org.apache.ibatis.executor.*;
 import org.apache.ibatis.mapping.*;
 import org.apache.ibatis.reflection.MetaObject;
+import org.apache.ibatis.reflection.property.PropertyTokenizer;
 import org.apache.ibatis.type.*;
+import org.apache.ibatis.builder.xml.dynamic.ForEachSqlNode;
 
 import java.sql.*;
 import java.util.List;
@@ -39,12 +41,19 @@
         if (parameterMapping.getMode() != ParameterMode.OUT) {
           Object value;
           String propertyName = parameterMapping.getProperty();
+          PropertyTokenizer prop = new PropertyTokenizer(propertyName);
           if (parameterObject == null) {
             value = null;
           } else if 
(typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {
             value = parameterObject;
           } else if (boundSql.hasAdditionalParameter(propertyName)) {
             value = boundSql.getAdditionalParameter(propertyName);
+          } else if (propertyName.startsWith(ForEachSqlNode.ITEM_PREFIX)
+              && boundSql.hasAdditionalParameter(prop.getName())) {
+            value = boundSql.getAdditionalParameter(prop.getName());
+            if (value != null) {
+              value = 
MetaObject.forObject(value).getValue(propertyName.substring(prop.getName().length()));
+            }
           } else {
             value = metaObject == null ? null : 
metaObject.getValue(propertyName);
           }

Modified: 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/builder/xml/dynamic/DynamicSqlSourceTest.java
URL: 
http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/builder/xml/dynamic/DynamicSqlSourceTest.java?rev=823012&r1=823011&r2=823012&view=diff
==============================================================================
--- 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/builder/xml/dynamic/DynamicSqlSourceTest.java
 (original)
+++ 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/builder/xml/dynamic/DynamicSqlSourceTest.java
 Thu Oct  8 03:34:07 2009
@@ -201,9 +201,9 @@
     BoundSql boundSql = source.getBoundSql(parameterObject);
     assertEquals(expected, boundSql.getSql());
     assertEquals(3, boundSql.getParameterMappings().size());
-    assertEquals("__item_0", 
boundSql.getParameterMappings().get(0).getProperty());
-    assertEquals("__item_1", 
boundSql.getParameterMappings().get(1).getProperty());
-    assertEquals("__item_2", 
boundSql.getParameterMappings().get(2).getProperty());
+    assertEquals("__frch_item_0", 
boundSql.getParameterMappings().get(0).getProperty());
+    assertEquals("__frch_item_1", 
boundSql.getParameterMappings().get(1).getProperty());
+    assertEquals("__frch_item_2", 
boundSql.getParameterMappings().get(2).getProperty());     
   }
 
   private DynamicSqlSource createDynamicSqlSource(SqlNode... contents) throws 
IOException, SQLException {


Reply via email to