2009-05-15 12 views
13

Estoy usando Hibernate 3.2 y usando los criterios para crear una consulta. Me gustaría agregar y "ordenar por" para una asociación de muchos a uno, pero no veo cómo se puede hacer eso. La consulta de Hibernate terminaría pareciéndose a esto, supongo:hibernate ordenar por asociación

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 

He intentado criteria.addOrder ("assnName.propertyName") pero no funciona. Sé que se puede hacer para las propiedades normales. ¿Me estoy perdiendo de algo?

Respuesta

23

Ok, encontré la respuesta. Probé algo que no pensé que funcionaría, pero para mi sorpresa sí. Yo estaba tratando de esto:

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

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

pero lo que realmente trabajado era:

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

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

que había hecho la suposición de que el método addOrder() era sólo puedan ser utilizados en los criterios principales y no en cualquier criterio de asociación.

14

que estaba teniendo el mismo problema y también puede resolverse de esta manera:

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

createAlias ​​le permite mantener sus criterios arraigados en su entidad original (WipDiscreteJob.class en este caso) para que pueda mantener construyendo sus criterios en caso de que lo necesite (por ejemplo, si necesita una segunda orden por propiedad de su entidad original).

+1

Estaba buscando todo esto, gracias! Incluso puede hacer '.createAlias ​​(" assnName "," assnName ")' que le permite mantener la misma sintaxis que HQL. –

+0

@Abdullah Me alegro de poder ayudar. – Marcelo

+1

Esto fue muy útil. Me tomó un tiempo encontrar esto. – smp7d