57

私は単純な問題で立ち往生しています。edエンティティorder byで呼び出す方法に苦労しています。join基本的に、私は次のことを達成しようとしていますJPA Criteria:

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)));

で達成する方法order by d.name, c.nameCriteria API?Expression、Path で試しましたが、うまくいきませんでした。どんなポインタでも大歓迎です。

4

5 に答える 5

86

いくつかの注文を追加する必要がある場合は、次のようなものを作成できます(ただし、クエリと異なるルート オブジェクトの場合)。

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);
于 2014-12-31T16:45:01.083 に答える
9

私は同じことをするのに苦労していましたが、このページで解決策を見つけました: http://www.objectdb.com/api/java/jpa/criteria/CriteriaQuery/orderBy_Order_

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

クエリ結果の順序付けに使用される順序付け式を指定します。以前の順序付け式があれば、それを置き換えます。順序付け式が指定されていない場合、以前の順序付けがあればそれが削除され、結果は特定の順序で返されません。順序付け式の左から右への順序によって優先順位が決まり、最も左のものが最も優先されます。

パラメータ: o - 0 個以上の順序付け式

戻り値: 変更されたクエリ

以降: JPA 2.0

于 2013-12-15T03:13:55.727 に答える