2013-08-22 10 views
24

Ich bin mit einem einfachen Problem stecken; kämpfen, wie order by auf einer join Ed-Einheit aufgerufen wird. Ich versuche, die folgenden mit JPA Criteria zu erreichen im Wesentlichen:JPA Criteria Query API und Bestellung von zwei Spalten

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 

Ich habe folgendes:

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

Wie erreichen order by d.name, c.name mit Criteria API? Ich habe es mit Expression, Path versucht, aber nicht funktioniert. Alle Hinweise werden sehr geschätzt.

Antwort

7

Ich habe Schwierigkeiten, das gleiche zu tun, und ich habe eine Lösung auf dieser Seite gefunden: http://www.objectdb.com/api/java/jpa/criteria/CriteriaQuery/orderBy_Order_

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

die Bestell Ausdrücke angeben, dass die Abfrageergebnisse werden verwendet, um zu bestellen. Ersetzt die vorherigen Bestellungsausdrücke, falls vorhanden. Wenn keine Bestellungsausdrücke angegeben sind, wird die vorherige Bestellung, falls vorhanden, einfach entfernt, und die Ergebnisse werden in keiner bestimmten Reihenfolge zurückgegeben. Die Reihenfolge von links nach rechts der Ordnungsausdrücke bestimmt den Vorrang, wobei die äußerste linke Priorität hat.

Parameter: o - null oder mehr Ordnung Ausdrücke

Returns: die geänderte Abfrage

seit: JPA 2,0

+1

Wie ist das eine Antwort für Problemautor beschrieben? – ByeBye

+1

Warum denkst du es nicht? Er wollte wissen, wie man nach mehreren Eigenschaften sortiert. Meine Antwort enthält, wie man das macht ... Vermisse ich etwas? – Adamsan

+0

Da es nicht mit distinct und Sortieren nach Eigenschaft von Join-Tabelle funktioniert – ByeBye

30

Wenn Sie einige Aufträge hinzufügen möchten, können Sie machen etwas wie (aber für Ihre Abfrage und verschiedene Root-Objekte)

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

Ich habe das gleiche Problem mit der Reihenfolge durch Verwendung der Kriterien API. Ich fand diese Lösung:

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