2013-08-22 19 views
24

Sono bloccato con un semplice problema; lottando su come chiamare order by su un'entità join edita. In sostanza sto cercando di raggiungere i seguenti obiettivi con JPA Criteria:Criteri JPA API di query e ordine di due colonne

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 

Ho il seguente:

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

Come realizzare order by d.name, c.name con Criteria API? Ho provato con Expression, Path ma non ha funzionato. Qualsiasi suggerimento sarà molto apprezzato.

risposta

7

stavo avendo problemi a fare lo stesso, e ho trovato una soluzione in questa pagina: http://www.objectdb.com/api/java/jpa/criteria/CriteriaQuery/orderBy_Order_

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

Specificare le espressioni di ordinamento che vengono utilizzati per ordinare i risultati della query. Sostituisce le precedenti espressioni di ordinazione, se presenti. Se non vengono specificate espressioni di ordinamento, l'ordine precedente, se presente, viene semplicemente rimosso e i risultati verranno restituiti senza un ordine particolare. La sequenza da sinistra a destra delle espressioni di ordinamento determina la precedenza, per cui la più a sinistra ha la precedenza più alta.

Parametri: O - zero o più ordinazione espressioni

Ritorni: la query modificata

dal: JPA 2,0

+1

Come è descritta una risposta all'autore del problema? – ByeBye

+1

Perché pensi che non sia così? Voleva sapere come ordinare per più proprietà. La mia risposta contiene come farlo ... Mi manca qualcosa? – Adamsan

+0

Perché non funzionerà con distinto e ordinamento per proprietà dalla tabella di join – ByeBye

30

Se avete bisogno di aggiungere paio di ordini si possono fare qualcosa di simile (ma per la tua query e diversi oggetti radice)

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

Ho lo stesso problema con l'ordine utilizzando l'API Criteri. Ho trovato questa soluzione:

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