java - mybatis 没有返回延迟提取的所有行
问题描述
使用 mybatis (3.4.4) 查询 oracle 后端时,我的 java 应用程序在使用延迟加载时未返回所有行。
本质上,
当我使用一些 SQL 工具(如 oracle Sql Developer)查询我的数据库时,我得到 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 个结果吗
解决方案
花了几天后,我找到了这个解决方案:
我的查询结果集包含一行 (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" />
推荐阅读
- r - 具有无限斜率的线性回归
- react-native - react-native-permissions 和 expo-permissions 之间是否有任何权衡?
- windows - 为什么 Git Windows 提交合并,即使使用 merge.commit=no?
- github-api - application/vnd.github+json 媒体类型是什么?
- java - 单击菜单项时未打开活动
- javascript - 如何使用 MongoDB 上的 CREATE、PUT 和 DELETE 请求优化性能?
- javascript - 如何将动态值与 HTML 元素相关联?
- python - Codewars 剥离评论问题随机工作/不工作“尝试”测试
- node.js - ExpressJS:本地主机没有发送任何数据
- javascript - 未检测到 Express 中间件