【发布时间】:2014-01-08 15:46:55
【问题描述】:
我试图找到一种优雅的方式,使用子对象集合的第一个属性而不是对象本身对 JPA 条件查询的结果进行排序。例如:
@Entity
class Parent {
protected Set<Child> children;
}
@Entity
class Child {
protected Date timestamp;
}
父母可以有多个孩子,每个孩子都有不同的时间戳。
我希望能够添加到现有的 JPA CriteriaQuery/TypedQuery,以便按 MAX(child.timestamp) 对父对象列表进行排序,因此具有最新子时间戳的父对象首先出现。
我的通用标准构建器实现是这样的:
CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery<T> criteriaQuery = criteriaBuilder.createQuery(daoClass);
Root<T> queryRoot = criteriaQuery.from(daoClass);
// add wheres
Predicate filters = createPredicate(criteriaQuery, queryRoot, criteriaBuilder);
// filters = criteriaBuilder.and( /* lots of Predicate filter objects */ );
criteriaQuery.where(filters);
// add sorts
criteriaQuery.orderBy(createOrders(queryRoot, criteriaBuilder));
// <-- Ideally somewhere here add the new ordering
TypedQuery<T> typedQuery = em.createQuery(criteriaQuery);
希望有一个不会破坏它太多的解决方案..
感谢您的帮助。
编辑:查询中收集的父数据是分页的,因此我无法对查询结果进行排序。它必须是我构造的 JPA 查询的一部分。
【问题讨论】:
标签: java hibernate jpa criteria