2013-08-22 19 views
24

私は簡単な問題で立ち往生しています。 join edエンティティでorder byを呼び出す方法に苦しんでいます。私は、次のしているJPA CriteriaクエリAPIと2列で注文する

select distinct d from Department d 
left join fetch d.children c 
left join fetch c.appointments a 
where d.parent is null 
order by d.name, c.name 

CriteriaBuilder cb = getEntityManager().getCriteriaBuilder(); 
CriteriaQuery<Department> c = cb.createQuery(Department.class); 
Root<Department> root = c.from(Department.class); 
Fetch<Department, Department> childrenFetch = root.fetch(
    Department_.children, JoinType.LEFT); 
childrenFetch.fetch(Department_.appointments, JoinType.LEFT); 

c.orderBy(cb.asc(root.get(Department_.name))); 
c.distinct(true); 
c.select(root); 
c.where(cb.isNull(root.get(Department_.parent))); 

どうCriteria APIorder by d.name, c.nameを達成するために基本的に私はJPA Criteriaと、次の達成しようとしていますか?私はExpression、Pathで試したが動作しなかった。 すべてのポインタは非常に高く評価されます。

答えて

7

私はトラブル同じことをやって持っていた、と私は、このページで解決策を見つけた: http://www.objectdb.com/api/java/jpa/criteria/CriteriaQuery/orderBy_Order_

//javax.persistence.criteria.CriteriaQuery 
//CriteriaQuery<T> orderBy(Order... o) 

クエリ結果を注文するために使用されている順序式を指定します。直前の順序式があれば置き換えます。順序式が指定されていない場合、前の順序があればそれを単に削除し、結果は特定の順序で返されます。順序式の左から右の順序で優先順位が決定され、最も左の優先順位が最も高くなります。

パラメータ: O - ゼロ個以上の注文の表現

戻り値: 修正クエリ

以来: JPA 2.0

+1

これは問題著者の答えですか? – ByeBye

+1

なぜそれはないと思いますか?彼は知りたい、複数のプロパティでどのように注文するか。私の答えはそれを行う方法が含まれています...私は何かを逃していますか? – Adamsan

+0

これは、結合表からの特性別のソートでは機能しないためです。 – ByeBye

30

あなたが注文のカップルを追加する必要がある場合はあなたが作ることができます(あなたのクエリと異なるルートオブジェクトのために)

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); 
CriteriaQuery<Route> query = criteriaBuilder.createQuery(Route.class); 
Root<Route> routeRoot = query.from(Route.class); 
query.select(routeRoot); 

List<Order> orderList = new ArrayList(); 
query.where(routeRoot.get("owner").in(user)); 

orderList.add(criteriaBuilder.desc(routeRoot.get("date"))); 
orderList.add(criteriaBuilder.desc(routeRoot.get("rating"))); 

query.orderBy(orderList); 
0

Criteria APIを使用することで、同じ問題が発生します。私はこの解決策を見つけました:

CriteriaQuery<Test> q = cb.createQuery(Test.class); 
Root<Test> c = q.from(Test.class); 
q.select(c); 
q.orderBy(cb.asc(c.get("name")), cb.desc(c.get("prenom"))); 
関連する問題