2010-01-19 6 views
0

J'ai trois entités ClassA, ClassB et ClassC.Critères d'hibernation OneToMany, ManyToOne et List

ClassA { 
... 
@Id 
@GeneratedValue 
@Column(name = "a_id") 
private long id; 
... 
@OneToMany(cascade={CascadeType.ALL}) 
@JoinColumn(name="a_id") 
private List<ClassB> bbb; 
... 
} 

ClassB { 
... 
@ManyToOne 
private ClassC ccc; 
... 
} 

ClassC { 
... 
private String name; 
... 
} 

Je veux filtrer par critères Hibernate ClassA par 'name' membre de ClassC. Donc, je veux obtenir par hibernate la liste des critères des objets ClassA qui ont des objets ClassC avec le nom spécifié. Le problème est que l'accès aux objets ClassC se fait à travers la liste ClassB.

J'ai essayé quelque chose comme ça, mais ça ne marche pas:

crit.createCriteria("bbb").createCriteria("ccc").add(Restrictions.ilike("name", name, MatchMode.ANYWHERE)); 

Je serai reconnaissant de l'aide.

Répondre

2

Vous devez utiliser des alias pour nicher les restrictions:

criteria.createAlias("bbb", "bbb", CriteriaSpecification.LEFT_JOIN); 
criteria.createAlias("bbb_ccc", "bbb.ccc", CriteriaSpecification.LEFT_JOIN); 
criteria.add(Restrictions.ilike("bbb_ccc.name", name, MatchMode.ANYWHERE)); 

Ce filtrera les résultats sur aaa entité, mais ne sera pas réellement chercher les entités associées (bbb et ccc). Pour récupérer ces entités, le plus simple est de définir le paramètre d'annotation de mapping sur FetchMode.EAGER. Mais vous pouvez également le faire dynamiquement dans le code par requête.

+0

ceci fonctionne bien! –

+0

La méthode createAlias ​​avec CriteriaSpecification est désormais obsolète –

0

comme CriteriaSpecification.LEFT_JOIN est maintenant dépréciée, vous pouvez utiliser org.hibernate.sql.JoinType.LEFT_OUTER_JOIN

criteria.createAlias("bbb", "bbb", JoinType.LEFT_OUTER_JOIN); criteria.createAlias("bbb_ccc", "bbb.ccc", JoinType.LEFT_OUTER_JOIN); criteria.add(Restrictions.ilike("bbb_ccc.name", name, MatchMode.ANYWHERE));

Questions connexes