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 {