首页 > 解决方案 > 当使用 Oracle 的 setFirstResults 和 setMaxResults 方法时,休眠返回两列而不是一列

问题描述

我有一个选择单个列的查询,我正在使用 SQLQuery 的 setFirstResults 和 setMaxResults 方法批量执行查询。

片段:

SQLQuery query = <query object with query projecting a single column>;
int maxResults = 50;
int batchSize = 50;
for (int i = 0; ; i++) {
     query.setFirstResult(batchSize*i);
     query.setMaxResults(maxResults);
     List resultSet = query.list();
     if(resultSet.isEmpty())
         break;
     //process result set
}

我将 hibernate 配置中的 showSQL 参数设置为 true 以查看 hibernate 生成的查询字符串。对于第一批,即当 i=0 时,下面是 hibernate 生成的查询:

select * from (/* query selecting single column here */) where rownum <= ?;

这是有道理的,因为它是第一批,我们想要第一行的结果,rownum 用于将结果数限制为 maxResults。

现在对于第二次和后续的批量读取,hibernate 生成的查询是:

select * from ( select row_.*, rownum rownum_ from (/*query selecting single column here */) row_ where rownum <= ?) where rownum_ > ?;

您可以清楚地看到,上面的查询选择了两列,一列是行号本身。

因此,当我的查询只选择一列时,hibernate 的查询版本选择了两列。

这是已知问题吗?我可以做一些不同的事情还是我做错了什么?

我不想在使用/处理它之前将结果集转换为两种不同的类型。

标签: oraclehibernaterownum

解决方案


推荐阅读