我有一张大而未知的桌子A.我需要从表中批量检索结果,即一次检索100个结果并对它们执行操作。为此,我有一个变量m,这样我就可以在循环中执行HQL等效的查询“SELECT * from A LIMIT m,100”,它将m迭代为1,101,201,......等等。循环的终止条件是什么?当在m> 1的条件下执行上述查询时的结果是什么?表中的行数?
答案 0 :(得分:1)
首先使用select count(*)查询,这将给出总记录数。现在你编写java代码来相应地设置限制。 (count / m)int = x =完整批次数和count-x * m =最后一批的行数。
答案 1 :(得分:1)
你所拥有的问题更为人所知的是分页。
您的问题是您可以从表中检索多少页?
您必须知道要使用分页的页数。
要设置页面计数,您需要执行具有相同FROM子句但仅SELECT count(*) FROM ...
的预查询。这将给你始终正确的答案。
如果您不能或不想使用额外声明。然后你应该作为页面的数据库,直到结果不为空。因此,您执行第1页,第2页,...页n的语句,直到结果的大小小于页面大小。
int pageSize = 100;
int page = 1;
do {
currentPage = loadPage(page, pageSize);
page++;
} while(currentPage.size() == pageSize);
答案 2 :(得分:0)
我建议使用hibernate函数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”条件以避免任何不必要的迭代。
希望这会有所帮助!!