从现有查询中导出新查询

时间:2015-10-26 13:17:38

标签: java jpa

我正在对实体进行基本分页。

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);
}

通过这种方式,我可以编写基本查询,因为它让我高兴(即使是一个命名查询),然后只需使用此方法对其进行分页。

如果可以,我应该如何同时编写safeCopycount方法?

哦,我忘记了:如果有任何迹象,我会在WildFly 8上使用Java 8和JavaEE 7。

另外,请注意这是一个简化的例子。我实际上使用了几个回调来编写我的selectwhereorderBy子句。

0 个答案:

没有答案