2009-05-15 14 views
13

Sto utilizzando Hibernate 3.2 e utilizzo i criteri per creare una query. Vorrei aggiungere e "ordinare per" un'associazione molti-a-uno, ma non vedo come ciò possa essere fatto. La query di Hibernate finirebbe simile a questo, immagino:hibernate ordine per associazione

select t1.a, t1.b, t1.c, t2.dd, t2.ee 
from t1 
inner join t2 on t1.a = t2.aa 
order by t2.dd <-- need to add this 

Ho provato criteria.addOrder ("assnName.propertyName"), ma non funziona. So che può essere fatto per le normali proprietà. Mi sto perdendo qualcosa?

risposta

23

Ok, ho trovato la risposta. Ho provato qualcosa che non pensavo avrebbe funzionato, ma con mia sorpresa ha fatto. Stavo cercando questo:

Criteria criteria = super.getSession().createCriteria(WipDiscreteJob.class); 

criteria.addOrder(Order.asc("assnName.propertyName")) 

ma ciò che in realtà ha funzionato è stato:

Criteria criteria = super.getSession().createCriteria(WipDiscreteJob.class); 
Criteria assnCrit = criteria.createCriteria("assnName"); 

assnCrit.addOrder(Order.asc("propertyName")); 

avevo fatto l'ipotesi che il metodo AddOrder() era utilizzabile solo sui criteri principali e non su qualsiasi criterio di associazione.

14

ho avuto lo stesso problema e può anche essere risolto in questo modo:

Criteria criteria = super.getSession().createCriteria(WipDiscreteJob.class) 
    .createAlias("assnName","a") 
    .addOrder(Order.asc("a.propertyName")); 

CREATEALIAS consente di mantenere i criteri radicato sul soggetto originale (WipDiscreteJob.class in questo caso) in modo da poter mantenere costruire i criteri in caso di necessità (ad esempio, se hai bisogno di un secondo ordine per proprietà dall'entità originale).

+1

Cercavo tutto questo, grazie! Puoi anche fare '.createAlias ​​(" assnName "," assnName ")' che ti permette di mantenere la stessa sintassi di HQL. –

+0

@Abdullah Felice di poter aiutare. – Marcelo

+1

Questo è stato molto utile. Ci è voluto un po 'per trovare questo. – smp7d

Problemi correlati