1

可能重复:
如何在 HQL 中进行限制查询

我有一张大但未知大小的桌子 A。我需要从表中分批检索结果,即一次 100 个,并对它们执行操作。为此,我有一个变量 m,以便我可以在循环中执行查询“SELECT * from A LIMIT m,100”的 HQL 等效项,该循环将 m 迭代为 1、101、201,... 等等。循环的终止条件是什么?在 m > 表中的行数的条件下执行上述查询会产生什么结果?

4

3 回答 3

1

首先使用 select count(*) 查询,这将为您提供记录总数。现在你编写java代码来相应地设置限制。(count/m) int = x= 完整批次的数量和 count-x*m = 最后批次的行数。

于 2012-09-28T16:22:34.127 回答
1

您遇到的问题更多地称为分页。

你的问题是你可以从一个表中检索多少页?

您必须知道页数才能使用分页。

要设置页数,您需要执行具有相同 FROM 子句但只有SELECT count(*) FROM .... 这将永远给你正确的答案。


如果你不能或不想使用额外的语句。然后你应该作为页面的数据库,直到结果不为空。因此,您对第 1 页、第 2 页、...第 n 页执行语句,直到结果大小小于页面大小。

int pageSize = 100;
int page     = 1;  
do {     
  currentPage = loadPage(page, pageSize);
  page++;
} while(currentPage.size() == pageSize); 
于 2012-09-28T16:40:52.730 回答
0

我建议使用休眠函数 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”条件下添加以避免任何不必要的迭代。

希望这可以帮助!!

于 2012-09-28T16:29:20.600 回答