Подтвердить что ты не робот

API запросов к критериям JPA и порядок по двум столбцам

Я застрял в простой проблеме; пытаясь вызвать order by в join ed сущности. По существу, я пытаюсь выполнить следующее с помощью 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, но не работал. Любые указатели будут очень благодарны.

4b9b3361

Ответ 1

Если вам нужно добавить пару заказов, вы можете сделать что-то вроде (но для вашего запроса и разных корневых объектов)

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

Ответ 2

У меня возникли проблемы с этим, и я нашел решение на этой странице: http://www.objectdb.com/api/java/jpa/criteria/CriteriaQuery/orderBy_Order_

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

Укажите выражения упорядочения, которые используются для заказа результатов запроса. Заменяет предыдущие выражения для заказа, если они есть. Если не заданы выражения для упорядочения, предыдущее упорядочение, если оно есть, просто удаляется, и результаты будут возвращаться в определенном порядке. Слева направо последовательности упорядочивающих выражений определяет приоритет, при котором самые левые имеют самый высокий приоритет.

Параметры:    o - нулевые или более упорядочивающие выражения

Возвращает:    измененный запрос

С:    JPA 2.0