JPA 2 CriteriaQuery按索引排序

时间:2012-02-29 00:02:34

标签: jpa-2.0 eclipselink criteria-api

我有一个包含List<EntityRevision>的实体。该集合有一个@OrderColumn

我希望获得按其索引排序的实体的所有EntityRevisions

我可以使用以下查询执行此操作:

SELECT er 
  FROM Entity e JOIN e.revisions er 
  WHERE e.id = :entityId 
  ORDER BY index(er)

但我无法弄清楚如何使用CriteriaQuery

使用EclipseLink 2.3.2 / JPA 2.0.3 - Root<EntityRevision>上没有index()方法,我可以在orderBy中使用。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

我还没有测试过,但有点像 criteriaQuery.orderBy(criteriaBuilder.asc(((ListJoin)root.get(“listMapping”))。index())); 如果您的listMapping是一个带有orderby列的列表,则应该有效。

答案 1 :(得分:0)

这对我有用:

final EntityManager m = ...
final CriteriaBuilder b = m.getCriteriaBuilder();
final CriteriaQuery<Child> q = b.createQuery( Child.class );
final Root<Parent> p = q.from( Parent.class );
final ListJoin<Parent, Child> j = p.join( Parent_.children );
final CriteriaQuery<Child> s = q.select( j );

s.where( b.equal( j.get( Child_.parent ), parent ) );
s.orderBy( b.asc( j.index() ) );

final TypedQuery<Child> t = m.createQuery( s );
final List<Child> children = t.getResultList();

Assert.assertEquals( parent.getChildren().size(), children.size() );
Assert.assertEquals( parent.getChildren(), children );