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。