私は単純な問題に悩まされています。 join
edエンティティでorder by
を呼び出す方法に苦労しています。基本的に、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.name
でCriteria API
を達成する方法は? Expression、Pathを試しましたが、うまくいきませんでした。どんなポインタも大歓迎です。
いくつかの注文を追加する必要がある場合は、次のようなものを作成できます(ただし、クエリと異なるルートオブジェクト用)
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);
私は同じことをするのに問題があり、このページで解決策を見つけました: 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
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")));
私のために働く解決策は次のとおりです
session=HibernateUtil.getSessionJavaConfigFactory_report().openSession();
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Object[]> criteriaQuery = builder.createQuery(Object[].class);
List<Order> orderList = new ArrayList();
orderList.add(builder.desc(ejeRoot.get("name")));
criteriaQuery.orderBy(orderList);
注:ejeRootはクラスオブジェクトです