mybatis不会在延迟获取时返回所有行

问题描述 投票:0回答:1

我的Java应用程序在使用mybatis(3.4.4)查询oracle后端时,在使用惰性加载时未返回所有行。

基本上是

  • [当我使用某些SQL工具(例如oracle Sql Developer)查询数据库时,我得到4000个结果

  • [当我使用selectCursor进行查询时会导致延迟加载conn.selectCusror(query),我只会得到560个结果!

  • [当我使用selectList查询时,它将立即获取所有结果conn.selectList(query),我将获得4000个结果(与数据库匹配)

Note:游标提供与列表相同的结果,不同之处在于它使用Iterator延迟获取数据。 Documentation

这是我计算记录数的方式

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

QUERY

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

有人可以告知为什么selectCursor没有给出全部4000个结果的原因

java mybatis ibatis
1个回答
0
投票

花了几天后,我找到了这个解决方案:

我的查询结果集包含一行(561),该行的列中具有空值。这应该不是问题,因为我可以在提取的列中使用null值。在这种情况下,code列的第561行的值为null。当通过selectCursor(一种懒惰的数据获取方法)来获取记录时,mybatis认为当所获取的行中的所有列均为空时,它已成为记录的结尾。

MyBatis,默认情况下,当返回的所有列都返回null行为NULL。启用此设置后,MyBatis返回一个空实例代替。请注意,它也适用于嵌套结果(即收集和关联)。由于:3.4.2https://mybatis.org/mybatis-3/configuration.html

但是,当您使用selectList时,您将不会遇到此问题,因为一次读取所有记录,并且光标不会继续检查下一个读取的记录的样子。

因此解决方案是将以下设置放入mybatis config.xml中

<setting name="returnInstanceForEmptyRow" value="true" />
© www.soinside.com 2019 - 2024. All rights reserved.