You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ibatis.apache.org by cb...@apache.org on 2009/03/01 23:15:50 UTC
svn commit: r749137 - in /ibatis/trunk/java/ibatis-3/ibatis-3-core/src:
main/java/org/apache/ibatis/executor/resultset/DefaultResultSetHandler.java
test/java/org/apache/ibatis/binding/BindingTest.java
Author: cbegin
Date: Sun Mar 1 22:15:50 2009
New Revision: 749137
URL: http://svn.apache.org/viewvc?rev=749137&view=rev
Log:
Fixed nested join mapping bug mentioned in last commit.
Modified:
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/resultset/DefaultResultSetHandler.java
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BindingTest.java
Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/resultset/DefaultResultSetHandler.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/resultset/DefaultResultSetHandler.java?rev=749137&r1=749136&r2=749137&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/resultset/DefaultResultSetHandler.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/resultset/DefaultResultSetHandler.java Sun Mar 1 22:15:50 2009
@@ -37,8 +37,6 @@
private ResultHandler resultHandler;
- private Reference<Boolean> foundValues;
-
public DefaultResultSetHandler(Configuration configuration, Executor executor, MappedStatement mappedStatement, ParameterHandler parameterHandler, int rowOffset, int rowLimit, ResultHandler resultHandler) {
this.configuration = configuration;
this.executor = executor;
@@ -50,7 +48,6 @@
this.parameterObject = parameterHandler.getParameterObject();
this.nestedResultObjects = new HashMap();
this.resultHandler = resultHandler;
- this.foundValues = new Reference<Boolean>(false);
}
public List handleResultSets(Statement statement) throws SQLException {
@@ -121,7 +118,7 @@
while ((maxResults == Executor.NO_ROW_LIMIT || resultsFetched < maxResults) && rs.next()) {
currentNestedKey = null;
ResultMap rm = resolveSubMap(rs, resultMap);
- Object resultObject = loadResultObject(rs, rm);
+ Object resultObject = loadResultObject(rs, rm, new Reference(false));
if (resultObject != NO_VALUE) {
if (resultObject instanceof PlatformTypeHolder) {
resultObject = ((PlatformTypeHolder) resultObject).get(null);
@@ -133,7 +130,7 @@
}
}
- private Object loadResultObject(ResultSet rs, ResultMap rm) throws SQLException {
+ private Object loadResultObject(ResultSet rs, ResultMap rm, Reference<Boolean> foundValues) throws SQLException {
if (rm.getType() == null) {
throw new ExecutorException("The result class was null when trying to get results for ResultMap.");
}
@@ -145,15 +142,13 @@
resultObject = ResultObjectProxy.createProxy(rm.getType(), resultObject, lazyLoader);
}
- // Rethink this implementation of foundValues. It's the only volatile state on the class...
- foundValues = new Reference<Boolean>(false);
List<ResultMapping> appliedResultMappings = new ArrayList<ResultMapping>();
- resultObject = mapResults(rs, rm, lazyLoader, resultObject, appliedResultMappings);
+ resultObject = mapResults(rs, rm, lazyLoader, resultObject, appliedResultMappings, foundValues);
resultObject = processNestedJoinResults(rs, appliedResultMappings, resultObject);
return resultObject;
}
- private Object mapResults(ResultSet rs, ResultMap rm, ResultLoaderRegistry lazyLoader, Object resultObject, List<ResultMapping> appliedResultMappings) throws SQLException {
+ private Object mapResults(ResultSet rs, ResultMap rm, ResultLoaderRegistry lazyLoader, Object resultObject, List<ResultMapping> appliedResultMappings, Reference<Boolean> foundValues) throws SQLException {
MetaObject metaResultObject = MetaObject.forObject(resultObject);
Set<String> propSet = new HashSet<String>();
Set<String> colSet = new HashSet<String>();
@@ -181,14 +176,14 @@
colName = colName == null ? null : colName.toUpperCase();
autoMappings.remove(propName);
if (colName == null || colSet.contains(colName)) {
- resultObject = processResult(rs, rm, resultMapping, lazyLoader, resultObject);
+ resultObject = processResult(rs, rm, resultMapping, lazyLoader, resultObject, foundValues);
appliedResultMappings.add(resultMapping);
}
}
// Automap remaining results
for (String key : autoMappings.keySet()) {
ResultMapping autoMapping = autoMappings.get(key);
- resultObject = processResult(rs, rm, autoMapping, lazyLoader, resultObject);
+ resultObject = processResult(rs, rm, autoMapping, lazyLoader, resultObject,foundValues);
appliedResultMappings.add(autoMapping);
}
return resultObject;
@@ -204,7 +199,7 @@
List<Class> argTypes = new ArrayList<Class>();
List<Object> argValues = new ArrayList<Object>();
for (ResultMapping resultMapping : rm.getConstructorResultMappings()) {
- Object value = processResult(rs, rm, resultMapping, null, constructorArgs);
+ Object value = processResult(rs, rm, resultMapping, null, constructorArgs, new Reference(false));
argTypes.add(resultMapping.getJavaType());
argValues.add(value);
}
@@ -243,7 +238,7 @@
return resultObject;
}
- private Object processResult(ResultSet rs, ResultMap rm, ResultMapping resultMapping, ResultLoaderRegistry lazyLoader, Object resultObject) throws SQLException {
+ private Object processResult(ResultSet rs, ResultMap rm, ResultMapping resultMapping, ResultLoaderRegistry lazyLoader, Object resultObject, Reference<Boolean> foundValues) throws SQLException {
if (resultMapping.getNestedQueryId() != null) {
Configuration configuration = mappedStatement.getConfiguration();
MappedStatement nestedQuery = configuration.getMappedStatement(resultMapping.getNestedQueryId());
@@ -251,12 +246,12 @@
Object parameterObject = prepareNestedParameterObject(rs, resultMapping, parameterType);
resultObject = processNestedSelectResult(nestedQuery, rm, resultMapping, lazyLoader, parameterObject, resultObject);
} else if (resultMapping.getNestedResultMapId() == null) {
- resultObject = processSimpleResult(rs, rm, resultMapping, resultObject);
+ resultObject = processSimpleResult(rs, rm, resultMapping, resultObject, foundValues);
}
return resultObject;
}
- private Object processSimpleResult(ResultSet rs, ResultMap rm, ResultMapping resultMapping, Object resultObject) throws SQLException {
+ private Object processSimpleResult(ResultSet rs, ResultMap rm, ResultMapping resultMapping, Object resultObject, Reference<Boolean> foundValues) throws SQLException {
MetaObject metaResultObject = MetaObject.forObject(resultObject);
Object value = getPrimitiveResultMappingValue(rs, resultMapping);
String property = resultMapping.getProperty();
@@ -296,8 +291,8 @@
String propertyName = resultMapping.getProperty();
MetaObject metaObject = MetaObject.forObject(knownResultObject);
- Object obj = metaObject.getValue(propertyName);
- if (obj == null) {
+ Object propertyValue = metaObject.getValue(propertyName);
+ if (propertyValue == null) {
if (type == null) {
type = metaObject.getSetterType(propertyName);
}
@@ -307,22 +302,23 @@
// then we will just set the property to the object created
// in processing the nested result map
if (Collection.class.isAssignableFrom(type)) {
- obj = objectFactory.create(type);
- metaObject.setValue(propertyName, obj);
+ propertyValue = objectFactory.create(type);
+ metaObject.setValue(propertyName, propertyValue);
}
} catch (Exception e) {
throw new ExecutorException("Error instantiating collection property for result '" + resultMapping.getProperty() + "'. Cause: " + e, e);
}
}
- Object o = loadResultObject(rs, nestedResultMap);
- if (o != null && o != NO_VALUE) {
- if (obj != null && obj instanceof Collection) {
+ Reference<Boolean> foundValues = new Reference(false);
+ Object nestedResultObject = loadResultObject(rs, nestedResultMap, foundValues);
+ if (nestedResultObject != null && nestedResultObject != NO_VALUE) {
+ if (propertyValue != null && propertyValue instanceof Collection) {
if (foundValues.get()) {
- ((Collection) obj).add(o);
+ ((Collection) propertyValue).add(nestedResultObject);
}
} else {
- metaObject.setValue(propertyName, o);
+ metaObject.setValue(propertyName, nestedResultObject);
}
}
} catch (SQLException e) {
@@ -487,4 +483,5 @@
this.value = value;
}
}
+
}
Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BindingTest.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BindingTest.java?rev=749137&r1=749136&r2=749137&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BindingTest.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BindingTest.java Sun Mar 1 22:15:50 2009
@@ -45,31 +45,15 @@
try {
BoundBlogMapper mapper = session.getMapper(BoundBlogMapper.class);
List<Blog> blogs = mapper.selectBlogWithAssociations(1);
- for (Blog blog : blogs) {
- System.out.println(blog);
- for (Post post : blog.getPosts()) {
- System.out.println(" " + post);
- if (post.getComments() != null) {
- for (Comment comment : post.getComments()) {
- System.out.println(" " + comment);
- }
- }
- if (post.getTags() != null) {
- for (Tag tag : post.getTags()) {
- System.out.println(" " + tag);
- }
- }
- }
- }
assertEquals(1, blogs.size());
Blog blog = blogs.get(0);
assertEquals(2, blog.getPosts().size());
Post firstPost = blog.getPosts().get(0);
- assertEquals(2, firstPost.getComments().size());
assertEquals(3, firstPost.getTags().size());
+ assertEquals(2, firstPost.getComments().size());
Post secondPost = blog.getPosts().get(1);
- assertEquals(0, secondPost.getComments().size());
assertEquals(1, secondPost.getTags().size());
+ assertEquals(0, secondPost.getComments().size());
} finally {
session.close();
}