Java 从现有查询派生新查询

Java 从现有查询派生新查询,java,jpa,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

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

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 paginedList paginate(类entityClass,int currentPage,int pageSize){
长计数=计数(entityClass);
TypedQuery=createQuery(entityClass);
query.setFirstResult((当前页面-1)*页面大小);
query.setMaxResults(页面大小);
返回PaginatedList.of(query.getResultList(),count,currentPage,pageSize);
}
私有长计数(类entityClass){
CriteriaBuilder CriteriaBuilder=entityManager.getCriteriaBuilder();
CriteriaQuery=criteriaBuilder.createQuery(Long.class);
query.select(criteriaBuilder.count(query.from(entityClass));
返回entityManager.createQuery(query.getSingleResult();
}
私有类型查询createQuery(类entityClass){
CriteriaBuilder CriteriaBuilder=entityManager.getCriteriaBuilder();
CriteriaQuery=criteriaBuilder.createQuery(entityClass);
根实体=query.from(entityClass);
查询、选择(实体);
返回entityManager.createQuery(查询);
}
如您所见,我正在从头开始构建查询

是否有任何方法可以使用引用查询执行相同的机制?我的意思是我想写这样的东西:

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);
}
public paginedlist paginate(TypedQuery查询,int currentPage,int pageSize){
TypedQuery q=安全副本(查询);
长计数=计数(q);
q、 setFirstResult((当前页面-1)*页面大小);
q、 setMaxResults(页面大小);
返回PaginatedList.of(q.getResultList(),count,currentPage,pageSize);
}
这样,我就可以随心所欲地编写基本查询(甚至作为命名查询),然后使用此方法简单地对其进行分页

如果可能,我应该如何编写我的
safeCopy
count
方法

哦,我忘了:如果有任何迹象的话,我在WildFly 8上使用Java8和JavaEE7


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

在Hibernate上,我认为有
detached标准。我不知道JPA是否也有同样的想法,我想请你提供信息,虽然我说的是JPA,只是JPA。我不会仅仅为了这个功能而切换到Hibernate。