可能重复:
如何在 HQL 中进行限制查询
我有一张大但未知大小的桌子 A。我需要从表中分批检索结果,即一次 100 个,并对它们执行操作。为此,我有一个变量 m,以便我可以在循环中执行查询“SELECT * from A LIMIT m,100”的 HQL 等效项,该循环将 m 迭代为 1、101、201,... 等等。循环的终止条件是什么?在 m > 表中的行数的条件下执行上述查询会产生什么结果?
可能重复:
如何在 HQL 中进行限制查询
我有一张大但未知大小的桌子 A。我需要从表中分批检索结果,即一次 100 个,并对它们执行操作。为此,我有一个变量 m,以便我可以在循环中执行查询“SELECT * from A LIMIT m,100”的 HQL 等效项,该循环将 m 迭代为 1、101、201,... 等等。循环的终止条件是什么?在 m > 表中的行数的条件下执行上述查询会产生什么结果?
首先使用 select count(*) 查询,这将为您提供记录总数。现在你编写java代码来相应地设置限制。(count/m) int = x= 完整批次的数量和 count-x*m = 最后批次的行数。
您遇到的问题更多地称为分页。
你的问题是你可以从一个表中检索多少页?
您必须知道页数才能使用分页。
要设置页数,您需要执行具有相同 FROM 子句但只有SELECT count(*) FROM ...
. 这将永远给你正确的答案。
如果你不能或不想使用额外的语句。然后你应该作为页面的数据库,直到结果不为空。因此,您对第 1 页、第 2 页、...第 n 页执行语句,直到结果大小小于页面大小。
int pageSize = 100;
int page = 1;
do {
currentPage = loadPage(page, pageSize);
page++;
} while(currentPage.size() == pageSize);
我建议使用休眠函数 setFirstResult() 和 setMaxResults() 来实现您想要的结果,例如:
Query query= session.createQuery("SELECT * from A");
int resultSize = 100;
List<?> pagedResults = null;
//use any approriate number for iterations or do a result count first to get the expected result size
for(int m=0; ; m++){
pagedResults = (List<?>)query.setFirstResult(m*resultSize).setMaxResults((m+1)*resultSize).list();
//do your processing
if(pagedResults.isEmpty() || pagedResults.size() <resultSize){
break; //no further iterations required
}
}
setMaxResults() 仅限制结果大小。如果可用记录较少,您将仅在结果中收到这些记录。在“if”条件下添加以避免任何不必要的迭代。
希望这可以帮助!!