我正在对实体进行基本分页。
public <T> PaginatedList<T> paginate(Class<T> entityClass, int currentPage, int pageSize) {
long count = count(entityClass);
TypedQuery<T> query = createQuery(entityClass);
query.setFirstResult((currentPage - 1) * pageSize);
query.setMaxResults(pageSize);
return PaginatedList.of(query.getResultList(), count, currentPage, pageSize);
}
private <T> long count(Class<T> entityClass) {
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Long> query = criteriaBuilder.createQuery(Long.class);
query.select(criteriaBuilder.count(query.from(entityClass)));
return entityManager.createQuery(query).getSingleResult();
}
private <T> TypedQuery<T> createQuery(Class<T> entityClass) {
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<T> query = criteriaBuilder.createQuery(entityClass);
Root<T> entity = query.from(entityClass);
query.select(entity);
return entityManager.createQuery(query);
}
如您所见,我正在从头开始构建查询。
有没有办法使用引用查询执行相同的机制?我的意思是我喜欢写这样的东西:
public <T> PaginatedList<T> paginate(TypedQuery<T> query, int currentPage, int pageSize) {
TypedQuery<T> q = safeCopy(query);
long count = count(q);
q.setFirstResult((currentPage - 1) * pageSize);
q.setMaxResults(pageSize);
return PaginatedList.of(q.getResultList(), count, currentPage, pageSize);
}
通过这种方式,我可以编写基本查询,因为它让我高兴(即使是一个命名查询),然后只需使用此方法对其进行分页。
如果可以,我应该如何同时编写safeCopy
和count
方法?
哦,我忘记了:如果有任何迹象,我会在WildFly 8上使用Java 8和JavaEE 7。
另外,请注意这是一个简化的例子。我实际上使用了几个回调来编写我的select
,where
和orderBy
子句。