Skip to content

Commit 430c98a

Browse files
committed
Completed fix for http://code.google.com/p/mybatis/issues/detail?id=139 (257) -- Cache causes provided result handler to fail.
Now selectMap and provided resultHandlers both work with local and global caches
1 parent b7dd2ef commit 430c98a

File tree

3 files changed

+43
-2
lines changed

3 files changed

+43
-2
lines changed

src/main/java/org/apache/ibatis/executor/BaseExecutor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ public List query(MappedStatement ms, Object parameter, RowBounds rowBounds, Res
105105
try {
106106
queryStack++;
107107
CacheKey key = createCacheKey(ms, parameter, rowBounds);
108-
list = (List) localCache.getObject(key);
108+
list = resultHandler == null ? (List) localCache.getObject(key) : null;
109109
if (list != null) {
110110
handleLocallyCachedOutputParameters(ms, key, parameter);
111111
} else {

src/main/java/org/apache/ibatis/executor/CachingExecutor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public List query(MappedStatement ms, Object parameterObject, RowBounds rowBound
5151
flushCacheIfRequired(ms);
5252
cache.getReadWriteLock().readLock().lock();
5353
try {
54-
if (ms.isUseCache()) {
54+
if (ms.isUseCache() && resultHandler == null) {
5555
CacheKey key = createCacheKey(ms, parameterObject, rowBounds);
5656
final List cachedList = (List) cache.getObject(key);
5757
if (cachedList != null) {

src/test/java/org/apache/ibatis/binding/BindingTest.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.apache.ibatis.binding;
22

33
import domain.blog.*;
4+
import org.apache.ibatis.executor.result.DefaultResultHandler;
45
import org.apache.ibatis.session.RowBounds;
56
import org.apache.ibatis.session.SqlSession;
67
import org.apache.ibatis.session.SqlSessionFactory;
@@ -135,6 +136,46 @@ public void shouldExecuteBoundSelectMapOfBlogsById() {
135136
}
136137
}
137138

139+
@Test
140+
public void shouldExecuteMultipleBoundSelectOfBlogsByIdInWithProvidedResultHandlerBetweenSessions() {
141+
SqlSession session = sqlSessionFactory.openSession();
142+
try {
143+
final DefaultResultHandler handler = new DefaultResultHandler();
144+
session.select("selectBlogsAsMapById", handler);
145+
146+
//new session
147+
session.close();
148+
session = sqlSessionFactory.openSession();
149+
150+
final DefaultResultHandler moreHandler = new DefaultResultHandler();
151+
session.select("selectBlogsAsMapById", moreHandler);
152+
153+
assertEquals(2, handler.getResultList().size());
154+
assertEquals(2, moreHandler.getResultList().size());
155+
156+
} finally {
157+
session.close();
158+
}
159+
}
160+
161+
@Test
162+
public void shouldExecuteMultipleBoundSelectOfBlogsByIdInWithProvidedResultHandlerInSameSession() {
163+
SqlSession session = sqlSessionFactory.openSession();
164+
try {
165+
final DefaultResultHandler handler = new DefaultResultHandler();
166+
session.select("selectBlogsAsMapById", handler);
167+
168+
final DefaultResultHandler moreHandler = new DefaultResultHandler();
169+
session.select("selectBlogsAsMapById", moreHandler);
170+
171+
assertEquals(2, handler.getResultList().size());
172+
assertEquals(2, moreHandler.getResultList().size());
173+
174+
} finally {
175+
session.close();
176+
}
177+
}
178+
138179
@Test
139180
public void shouldExecuteMultipleBoundSelectMapOfBlogsByIdInSameSessionWithoutClearingLocalCache() {
140181
SqlSession session = sqlSessionFactory.openSession();

0 commit comments

Comments
 (0)