0

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

本质上,

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

  • 当我使用导致延迟加载的selectCursorconn.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 个结果吗

4

1 回答 1

0

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

我的查询结果集包含一行 (561),其列中有空值。这不应该是一个问题,因为我可以在我获取的列中有空值。在这种情况下,code列在第 561 行具有值null。当通过selectCursor(获取数据的惰性方法)获取记录时,mybatis 认为当获取的行中的所有列都为空时,记录结束。

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

但是,当您使用时,您不会遇到这个问题,selectList因为一次提取所有记录并且游标不会继续检查下一个提取记录的外观。

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

<setting name="returnInstanceForEmptyRow" value="true" />
于 2020-02-19T17:43:37.920 回答