当表大小未知时,如何在HQL中执行限制查询?

时间:2012-09-28 16:12:02

标签: java sql hibernate hql

  

可能重复:
  How do you do a limit query in HQL

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

3 个答案:

答案 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”条件以避免任何不必要的迭代。

希望这会有所帮助!!