mybatis没有返回lazy fetch上的所有行

uinbv5nw  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(592)

我的java应用程序在使用mybatis(3.4.4)查询oracle后端时,在使用lazy load时没有返回所有行。
基本上,
当我使用一些sql工具(比如oraclesqldeveloper)查询数据库时,我得到了4000个结果
当我使用selectcursor进行查询时,这会导致延迟加载 conn.selectCusror(query) 我只得到560分!
当我使用selectlist进行查询时,它将一次获取所有结果 conn.selectList(query) 我得到4000个结果(与数据库匹配)
注意:游标提供的结果与列表相同,只是它使用迭代器延迟地获取数据。文档
我就是这样数唱片的

Cursor<Object> cur = conn.selectCursor(query) ; // query definition is written below
int count =0;
for(Object ob : cur){
    count++;
}
System.out.println(count);

查询

<select id="query" fetchSize="20000" resultType="java.util.Map" >
    select distinct code from my CODES_VIEW
</select>

有人能告诉我为什么selectcursor没有给出所有的4000个结果吗

n3schb8v

n3schb8v1#

在花了几天时间之后,我找到了这个解决方案:
我的查询结果集包含一行(561),该行的列中有空值。这应该不是问题,因为在我获取的列中可以有空值。在这种情况下 code 列有值 null 第561行。通过获取记录时 selectCursor (获取数据的惰性方法)mybatis认为,当获取的行中的所有列都为空时,它就是记录的结尾。
默认情况下,mybatis在返回行的所有列都为null时返回null。启用此设置后,mybatis将返回一个空示例。请注意,它也适用于嵌套结果(即collectioin和association)。自:3.4.2https://mybatis.org/mybatis-3/configuration.html
但是,当您使用 selectList 因为所有的记录都是一次获取的,而且cursor不会一直检查下一个获取的记录是什么样子的。
因此,解决方案是将以下设置放在mybatis config.xml中

<setting name="returnInstanceForEmptyRow" value="true" />

相关问题