2013-08-22 14 views
24

Utknąłem z prostym problemem; walczy jak wywołać order by na jednostce ed join. Zasadniczo próbuję osiągnąć następujące z JPA Criteria:Kryteria zapytania JPA i kolejność według dwóch kolumn

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 

Mam następujący:

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

Jak osiągnąć order by d.name, c.name z Criteria API? Próbowałem z Expression, Path, ale nie działałem. Wszelkie wskazówki będą bardzo mile widziane.

Odpowiedz

7

miałem problemy robi to samo, i znalazłem rozwiązanie na tej stronie: http://www.objectdb.com/api/java/jpa/criteria/CriteriaQuery/orderBy_Order_

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

Określ zamawiania wyrażeń, które są wykorzystywane na zamówienie wyniki kwerendy. Zastępuje poprzednie wyrażenia porządkowe, jeśli takie istnieją. Jeśli nie podano wyrażeń zamawiania, poprzednia kolejność, jeśli istnieje, zostanie po prostu usunięta, a wyniki zostaną zwrócone w dowolnej kolejności. Sekwencja od lewej do prawej w wyrażeniach porządkowych określa pierwszeństwo, przy czym najwyższy priorytet ma lewy skrajny.

Parametry: O - zero lub więcej zamawiania wyrażenia

Powroty: zmodyfikowany zapytań

od: JPA 2,0

+1

Jak opisano tę odpowiedź dla autora problemu? – ByeBye

+1

Dlaczego uważasz, że tak nie jest? Chciał wiedzieć, jak zamawiać według wielu właściwości. Moja odpowiedź brzmi: jak to zrobić ... Czy brakuje mi czegoś? – Adamsan

+0

Ponieważ nie będzie działać z oddzielnymi i sortującymi według właściwości z tabeli dołączania – ByeBye

30

Jeśli trzeba dodać parę zleceń można zrobić coś jak (ale dla twojego zapytania i różnych obiektów root)

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

Mam ten sam problem z zamówieniem za pomocą API kryteriów. Znalazłem to rozwiązanie:

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"))); 
Powiązane problemy