2009-12-18 6 views
3

Dans mon modèle de domaine je suit Classes.A « UserProfile » a un « SecurityPrincipal »Hibernate tri par propriétés de haricot intérieur?

class SecurityPrincipal{ 
private String loginId; 
private String password; 
private Date registeredData; 
private int status; 
} 



class UserProfile { 

private String name; 
private String company; 
private SecurityPrincipa principal 

} 

Je veux obtenir les résultats triés des objets « UserProfile » et il fonctionne très bien pour les properties.Like simples

DetachedCriteria criteria=DetachedCriteria.forClass(UserProfile.class);  

criteria.addOrder(Order.asc("name"); 

Mais lorsque je tente d'accéder aux propriétés de haricot interne (par exemple SecurityPrincipal) comme

criteria.addOrder(Order.asc("principal.status"); 

Mise en veille prolongée donne l'erreur:

Caused by: org.hibernate.QueryException: could not resolve property: securityPrincipal.status of: com.bigg.ibmd.usermanagement.model.UserProfile at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:44) at org.hibernate.persister.entity.AbstractPropertyMapping.toColumns(AbstractPropertyMapping.java:59) at org.hibernate.persister.entity.BasicEntityPropertyMapping.toColumns(BasicEntityPropertyMapping.java:31)

Comment puis-je trier mes résultats par propriétés d'une propriété?

Merci

Répondre

4

Essayez ceci:

DetachedCriteria criteria=DetachedCriteria.forClass(UserProfile.class);   
criteria.createAlias("principal", "p"); 
criteria.addOrder(Order.asc("p.name")); 

Je n'ai pas essayé, et je ne suis sûr que c'est la plus belle façon, mais je pense que cela devrait fonctionner.

0

Pour le filtrage par plusieurs champs, vous devez utiliser l'annotation @OrderBy. Par exemple:

@OrderBy ("id, nom, quel que soit") principal SecurityPrincipa privé ...

attention salariale Critères JPA api 2.0 génère OUTER JOIN pour les collections. Cela signifie que si vous n'avez pas une relation un à un mais un à plusieurs dans la table, elle obtient plusieurs résultats:

@OrderBy ("weight, height") private Collection userVitalStatsCollection;

Pour éviter les doublons, il est pratique d'utiliser la vue Base de données.

Questions connexes