获取计数并产生一个查询 JPA

Posted

技术标签:

【中文标题】获取计数并产生一个查询 JPA【英文标题】:Get Count and result in one query JPA 【发布时间】:2016-02-16 09:11:48 【问题描述】:

我是 Hibernate 和 JPA 的新手。我正在尝试通过过滤实现分页。 由于这个原因,我现在使用 2 个查询:

        query = em.createQuery("SELECT l from LoanAccount l where l."+filterColumn +" LIKE :filterValue  and l.assignedBranchKey=:TaskID order by l." + orderByColumnID +" " + orrderByASC);
        q = em.createQuery("SELECT count(l.id) from LoanAccount l where l."+filterColumn +" LIKE :filterValue and l.assignedBranchKey=:TaskID");
        query.setParameter("filterValue", "%"+filterValue+"%");
        q.setParameter("filterValue", "%"+filterValue+"%");
        q.setParameter("TaskID", TaskID);
        query.setParameter("TaskID", TaskID);

        query.setFirstResult(page*count-count);
        query.setMaxResults(count);


        result.setMaxResults((Long)q.getSingleResult());
        result.setData(query.getResultList());

        return result;

所以我在第一个查询中设置了第一个和最后一个结果,所以我无法获取列表并获取它的大小。这就是为什么我创建了第二个查询并在不设置第一个和最后一个结果的情况下使用它 - 以获得分页的准确行数。

页面 - 用户现在看到的页面

count - 该页面应该有多少行

是否可以结合这两个查询?如果是,我该怎么做?

【问题讨论】:

【参考方案1】:

你也可以使用ScrollableResults

这是一个例子(代码未经测试):

String hql = "SELECT l from LoanAccount l where l."+filterColumn +" LIKE :filterValue  and l.assignedBranchKey=:TaskID order by l." + orderByColumnID +" " + orrderByASC;
Query query = session.createQuery(hql);
query.setParameter("filterValue", "%"+filterValue+"%");
query.setParameter("TaskID", TaskID);
int pageSize = 10;

ScrollableResults resultScroll = query.scroll(ScrollMode.FORWARD_ONLY);
resultScroll.first();
resultScroll.scroll(0);
List<LoanAccount> loanAccountPage = Lists.newArrayList();
int i = 0;
while (pageSize > i++) 
    loanAccountPage .add((LoanAccount ) resultScroll.get(0));
    if (!resultScroll.next())
        break;

【讨论】:

【参考方案2】:

实际上,您不能同时组合这两个查询。 但是你可以通过使用这个 JpaUtils 库来生成计数查询来节省一些代码/错误:

Long count = JpaUtils.count(entityManager, criteriaQuery);

更多信息在这里 => https://***.com/a/9246377/5611906

【讨论】:

以上是关于获取计数并产生一个查询 JPA的主要内容,如果未能解决你的问题,请参考以下文章

JPA 计数 NamedQuery

如何在 Spring Data JPA 中获取 countQuery 返回的计数?

BigQuery:如何执行滚动时间戳窗口组计数,每天产生行

复杂的多对多 JPA CriteriaQuery

使用 CriteriaBuilder 的 JPA 计数(*)。如何使用 CriteriaBuilder 检索 count(*) 列

核心数据获取并获得准确的对象计数