我试图找到一种使用子对象集合的第一个属性而不是对象本身对JPA条件查询的结果进行排序的优雅方法。例如:

@Entity
class Parent {
  protected Set<Child> children;
}

@Entity
class Child {
  protected Date timestamp;
}


父母可以有几个孩子,每个孩子都有不同的时间戳。

我希望能够添加到现有的JPA CriteriaQuery / TypedQuery中,以便按MAX(child.timestamp)对Parent对象的列表进行排序,因此具有最新子时间戳的父对象会首先出现。

我的通用条件构建器实现是这样的:

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查询的一部分。

最佳答案

你不能



@Entity
class Parent {
  @OrderBy("timestamp DESC")
  protected Set<Child> children;
}

09-28 14:51