我是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 - 该页面中应该有多少行
是否可以结合这2个查询?如果是的话我该怎么做?
答案 0 :(得分:0)
嘿,你也可以使用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;
}
答案 1 :(得分:0)
您实际上无法一次组合这两个查询。 但是你可以通过使用这个 JpaUtils 库来生成计数查询来节省一些代码/错误:
Long count = JpaUtils.count(entityManager, criteriaQuery);
此处有更多信息 => https://stackoverflow.com/a/9246377/5611906