gpt4 book ai didi

java - mybatis 不返回延迟获取的所有行

转载 作者:行者123 更新时间:2023-12-01 18:26:50 26 4
gpt4 key购买 nike

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

本质上,

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

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

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

注意:游标提供与列表相同的结果,只不过它使用迭代器延迟获取数据。 Documentation

这就是我计算记录数的方法

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 个结果

最佳答案

花了几天时间我找到了这个解决方案:

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

MyBatis, by default, returns null when all the columns of a returned row are NULL. When this setting is enabled, MyBatis returns an empty instance instead. Note that it is also applied to nested results (i.e. collectioin and association). Since: 3.4.2 https://mybatis.org/mybatis-3/configuration.html

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

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

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

关于java - mybatis 不返回延迟获取的所有行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60216862/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com