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

Java 当表大小未知时,如何在HQL中执行限制查询?,java,sql,hibernate,hql,Java,Sql,Hibernate,Hql,可能重复: 我有一张桌子很大,但大小不详。我需要从表中批量检索结果,即每次检索100个,并对其执行操作。为此,我有一个变量m,这样我就可以在一个循环中执行HQL等价的查询“SELECT*from a LIMIT m,100”,它将m迭代为1,101,201。。。等等环路的终止条件是什么?当在m>表中的行数的条件下执行上述查询时,结果是什么?首先使用select count(*)查询,这将给出记录总数。现在编写java代码来相应地设置限制。 (count/m)int=x=完整批次的数量,coun

可能重复:

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

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

我建议使用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
        }
    }
Query Query=session.createQuery(“从A中选择*);
int resultSize=100;
列表pagedResults=null;
//使用任何适当的迭代次数,或者首先进行结果计数,以获得预期的结果大小
对于(int m=0;m++){
pagedResults=(列表)query.setFirstResult(m*resultSize).setMaxResults((m+1)*resultSize.List();
//做你的处理

如果(pagedResults.isEmpty()| | pagedResults.size()您遇到的问题称为分页

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

要使用分页,必须知道页数

要设置页面计数,您需要执行预查询,该预查询将具有相同的FROM子句,但只从…
选择计数(*)。这将始终为您提供正确答案


如果您不能或不想使用额外语句,则应将其作为页面的数据库,直到结果不为空。因此,您可以执行第1页、第2页、…第n页的语句,直到结果的大小小于页面大小

int pageSize = 100;
int page     = 1;  
do {     
  currentPage = loadPage(page, pageSize);
  page++;
} while(currentPage.size() == pageSize); 

如果dabase的页面超过1000页,则代码无法运行。如果无法确定结束点,请尝试查找while循环的条件。while的条件已在for循环中。删除了for循环中的比较语句以使其开放。终止条件已存在。希望这对您的场景有所帮助!