我有一个选择单列的查询,我使用setFirstResults& amp;批量执行查询。 SQLQuery的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的查询版本选择了两列。
这是已知的问题吗?我可以做些不同的事情,还是我做错了什么?
在使用/处理之前,我不想将结果集转换为两种不同的类型。