Skip to content

Commit 9589554

Browse files
committed
#39 Merged into 3.3.x branch
1 parent a9d7ed0 commit 9589554

File tree

7 files changed

+130
-19
lines changed

7 files changed

+130
-19
lines changed

src/main/java/org/apache/ibatis/executor/resultset/DefaultResultSetHandler.java

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
/**
6161
* @author Clinton Begin
6262
* @author Eduardo Macarron
63+
* @author Iwao AVE!
6364
*/
6465
public class DefaultResultSetHandler implements ResultSetHandler {
6566

@@ -78,7 +79,7 @@ public class DefaultResultSetHandler implements ResultSetHandler {
7879

7980
// nested resultmaps
8081
private final Map<CacheKey, Object> nestedResultObjects = new HashMap<CacheKey, Object>();
81-
private final Map<CacheKey, Object> ancestorObjects = new HashMap<CacheKey, Object>();
82+
private final Map<String, Object> ancestorObjects = new HashMap<String, Object>();
8283
private final Map<String, String> ancestorColumnPrefix = new HashMap<String, String>();
8384

8485
// multiple resultsets
@@ -755,9 +756,9 @@ private void handleRowValuesForNestedResultMap(ResultSetWrapper rsw, ResultMap r
755756
nestedResultObjects.clear();
756757
storeObject(resultHandler, resultContext, rowValue, parentMapping, rsw.getResultSet());
757758
}
758-
rowValue = getRowValue(rsw, discriminatedResultMap, rowKey, rowKey, null, partialObject);
759+
rowValue = getRowValue(rsw, discriminatedResultMap, rowKey, null, partialObject);
759760
} else {
760-
rowValue = getRowValue(rsw, discriminatedResultMap, rowKey, rowKey, null, partialObject);
761+
rowValue = getRowValue(rsw, discriminatedResultMap, rowKey, null, partialObject);
761762
if (partialObject == null) {
762763
storeObject(resultHandler, resultContext, rowValue, parentMapping, rsw.getResultSet());
763764
}
@@ -772,14 +773,14 @@ private void handleRowValuesForNestedResultMap(ResultSetWrapper rsw, ResultMap r
772773
// GET VALUE FROM ROW FOR NESTED RESULT MAP
773774
//
774775

775-
private Object getRowValue(ResultSetWrapper rsw, ResultMap resultMap, CacheKey combinedKey, CacheKey absoluteKey, String columnPrefix, Object partialObject) throws SQLException {
776+
private Object getRowValue(ResultSetWrapper rsw, ResultMap resultMap, CacheKey combinedKey, String columnPrefix, Object partialObject) throws SQLException {
776777
final String resultMapId = resultMap.getId();
777778
Object resultObject = partialObject;
778779
if (resultObject != null) {
779780
final MetaObject metaObject = configuration.newMetaObject(resultObject);
780-
putAncestor(absoluteKey, resultObject, resultMapId, columnPrefix);
781+
putAncestor(resultObject, resultMapId, columnPrefix);
781782
applyNestedResultMappings(rsw, resultMap, metaObject, columnPrefix, combinedKey, false);
782-
ancestorObjects.remove(absoluteKey);
783+
ancestorObjects.remove(resultMapId);
783784
} else {
784785
final ResultLoaderMap lazyLoader = new ResultLoaderMap();
785786
resultObject = createResultObject(rsw, resultMap, lazyLoader, columnPrefix);
@@ -790,9 +791,9 @@ private Object getRowValue(ResultSetWrapper rsw, ResultMap resultMap, CacheKey c
790791
foundValues = applyAutomaticMappings(rsw, resultMap, metaObject, columnPrefix) || foundValues;
791792
}
792793
foundValues = applyPropertyMappings(rsw, resultMap, metaObject, lazyLoader, columnPrefix) || foundValues;
793-
putAncestor(absoluteKey, resultObject, resultMapId, columnPrefix);
794+
putAncestor(resultObject, resultMapId, columnPrefix);
794795
foundValues = applyNestedResultMappings(rsw, resultMap, metaObject, columnPrefix, combinedKey, true) || foundValues;
795-
ancestorObjects.remove(absoluteKey);
796+
ancestorObjects.remove(resultMapId);
796797
foundValues = lazyLoader.size() > 0 || foundValues;
797798
resultObject = foundValues ? resultObject : null;
798799
}
@@ -803,11 +804,11 @@ private Object getRowValue(ResultSetWrapper rsw, ResultMap resultMap, CacheKey c
803804
return resultObject;
804805
}
805806

806-
private void putAncestor(CacheKey rowKey, Object resultObject, String resultMapId, String columnPrefix) {
807+
private void putAncestor(Object resultObject, String resultMapId, String columnPrefix) {
807808
if (!ancestorColumnPrefix.containsKey(resultMapId)) {
808809
ancestorColumnPrefix.put(resultMapId, columnPrefix);
809810
}
810-
ancestorObjects.put(rowKey, resultObject);
811+
ancestorObjects.put(resultMapId, resultObject);
811812
}
812813

813814
//
@@ -822,24 +823,19 @@ private boolean applyNestedResultMappings(ResultSetWrapper rsw, ResultMap result
822823
try {
823824
final String columnPrefix = getColumnPrefix(parentPrefix, resultMapping);
824825
final ResultMap nestedResultMap = getNestedResultMap(rsw.getResultSet(), nestedResultMapId, columnPrefix);
825-
CacheKey rowKey = null;
826-
Object ancestorObject = null;
827-
if (ancestorColumnPrefix.containsKey(nestedResultMapId)) {
828-
rowKey = createRowKey(nestedResultMap, rsw, ancestorColumnPrefix.get(nestedResultMapId));
829-
ancestorObject = ancestorObjects.get(rowKey);
830-
}
826+
Object ancestorObject = ancestorObjects.get(nestedResultMapId);
831827
if (ancestorObject != null) {
832828
if (newObject) {
833829
linkObjects(metaObject, resultMapping, ancestorObject); // issue #385
834830
}
835831
} else {
836-
rowKey = createRowKey(nestedResultMap, rsw, columnPrefix);
832+
final CacheKey rowKey = createRowKey(nestedResultMap, rsw, columnPrefix);
837833
final CacheKey combinedKey = combineKeys(rowKey, parentRowKey);
838834
Object rowValue = nestedResultObjects.get(combinedKey);
839835
boolean knownValue = (rowValue != null);
840836
instantiateCollectionPropertyIfAppropriate(resultMapping, metaObject); // mandatory
841837
if (anyNotNullColumnHasValue(resultMapping, columnPrefix, rsw.getResultSet())) {
842-
rowValue = getRowValue(rsw, nestedResultMap, combinedKey, rowKey, columnPrefix, rowValue);
838+
rowValue = getRowValue(rsw, nestedResultMap, combinedKey, columnPrefix, rowValue);
843839
if (rowValue != null && !knownValue) {
844840
linkObjects(metaObject, resultMapping, rowValue);
845841
foundValues = true;
@@ -903,6 +899,9 @@ private CacheKey createRowKey(ResultMap resultMap, ResultSetWrapper rsw, String
903899
} else {
904900
createRowKeyForMappedProperties(resultMap, rsw, cacheKey, resultMappings, columnPrefix);
905901
}
902+
if (cacheKey.getUpdateCount() < 2) {
903+
return CacheKey.NULL_CACHE_KEY;
904+
}
906905
return cacheKey;
907906
}
908907

src/test/java/org/apache/ibatis/submitted/nestedresulthandler/Item.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,16 @@ public class Item {
1919
private Integer id;
2020
private String name;
2121

22+
public String toString(){
23+
return new StringBuilder()
24+
.append("Item(")
25+
.append(id)
26+
.append(", ")
27+
.append(name)
28+
.append(" )")
29+
.toString();
30+
}
31+
2232
public Integer getId() {
2333
return id;
2434
}

src/test/java/org/apache/ibatis/submitted/nestedresulthandler/Mapper.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,5 @@
2020
public interface Mapper {
2121
List<Person> getPersons();
2222
List<Person> getPersonsWithItemsOrdered();
23+
List<PersonItemPair> getPersonItemPairs();
2324
}

src/test/java/org/apache/ibatis/submitted/nestedresulthandler/Mapper.xml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,23 @@
4040
where p.id = i.owner
4141
order by i.name
4242
</select>
43+
44+
<select id="getPersonItemPairs" resultMap="personItemPairResult">
45+
select p.id as person_id, p.name as person_name, i.id as item_id, i.name as item_name
46+
from persons p, items i
47+
where p.id = i.owner
48+
order by p.id, i.id
49+
</select>
50+
51+
<resultMap id="personItemPairResult" type="org.apache.ibatis.submitted.nestedresulthandler.PersonItemPair">
52+
<association property="person" javaType="org.apache.ibatis.submitted.nestedresulthandler.Person">
53+
<id property="id" column="person_id" />
54+
<result property="name" column="person_name"/>
55+
</association>
56+
<association property="item" javaType="org.apache.ibatis.submitted.nestedresulthandler.Item">
57+
<id property="id" column="item_id"/>
58+
<result property="name" column="item_name"/>
59+
</association>
60+
</resultMap>
61+
4362
</mapper>

src/test/java/org/apache/ibatis/submitted/nestedresulthandler/NestedResultHandlerTest.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,4 +150,24 @@ public void testGetPersonOrderedByItem() {
150150
}
151151
}
152152

153+
@Test //reopen issue 39? (not a bug?)
154+
public void testGetPersonItemPairs(){
155+
SqlSession sqlSession = sqlSessionFactory.openSession();
156+
try{
157+
Mapper mapper = sqlSession.getMapper(Mapper.class);
158+
List<PersonItemPair> pairs = mapper.getPersonItemPairs();
159+
160+
Assert.assertNotNull( pairs );
161+
// System.out.println( new StringBuilder().append("selected pairs: ").append(pairs) );
162+
163+
Assert.assertEquals(5, pairs.size() );
164+
Assert.assertNotNull(pairs.get(0).getPerson());
165+
Assert.assertEquals(pairs.get(0).getPerson().getId(), Integer.valueOf(1));
166+
Assert.assertNotNull(pairs.get(0).getItem());
167+
Assert.assertEquals( pairs.get(0).getItem().getId(), Integer.valueOf(1));
168+
} finally{
169+
sqlSession.close();
170+
}
171+
}
172+
153173
}

src/test/java/org/apache/ibatis/submitted/nestedresulthandler/Person.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,19 @@
2222
public class Person {
2323
private Integer id;
2424
private String name;
25-
private List<Item> items=new ArrayList<Item>();
25+
private List<Item> items=new ArrayList<Item>();
26+
27+
public String toString(){
28+
return new StringBuilder()
29+
.append("Person(")
30+
.append(id)
31+
.append(", ")
32+
.append(name)
33+
.append(", ")
34+
.append(items)
35+
.append(" )")
36+
.toString();
37+
}
2638

2739
public Integer getId() {
2840
return id;
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/**
2+
* Copyright 2009-2015 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package org.apache.ibatis.submitted.nestedresulthandler;
17+
18+
/**
19+
* Created by eyal on 12/9/2015.
20+
*/
21+
public class PersonItemPair {
22+
private Person person;
23+
private Item item;
24+
25+
public String toString(){
26+
return new StringBuilder()
27+
.append("PersonItemPair(")
28+
.append(person)
29+
.append(", ")
30+
.append(item)
31+
.append(" )")
32+
.toString();
33+
}
34+
35+
public Person getPerson() {
36+
return person;
37+
}
38+
39+
public void setPerson(Person person) {
40+
this.person = person;
41+
}
42+
43+
public Item getItem() {
44+
return item;
45+
}
46+
47+
public void setItem(Item item) {
48+
this.item = item;
49+
}
50+
}

0 commit comments

Comments
 (0)