2010-12-10 5 views
1

J'ai deux entités ...Mise en veille prolongée findByExample avec les membres non primitifs

fichier et l'utilisateur

fichier a un @ManyToOne Référence à l'utilisateur avec l'annotation suivante sur le membre:

@ManyToOne 
@JoinColumn(name="user_id") 
private User user 

J'essaie de trouver tous les fichiers pour un utilisateur en utilisant la méthode "findByExample".

J'ai créé une instance de Fichier et une instance de Utilisateur (avec le jeu de nom d'utilisateur). J'ai ajouté l'instance de l'utilisateur à l'instance de fichier et passé à « findByExample » comme ceci:

Criteria crit = getSession().createCriteria(File.class); 
Example ex = Example.create(exampleInstance); 
crit.add(ex); 
return crit.list(); 

Malheureusement « liste() » retourne tous les fichiers de mon db, pas seulement ceux pour spécifié utilisateur. J'ai inspecté le SQL généré et je vois qu'il n'inspecte pas l'objet User pour les valeurs, simplement en joignant les tables et en faisant un "where (1 = 1)".

Est-il possible qu'hibernate n'inspecte pas les membres non primitifs lors d'une requête "findByExample"?

Répondre

1

Un vieux TODO dans org.hibernate.criterion.Example ligne de classe 207 explique ce numéro:

//TODO: get all properties, not just the fetched ones! 
Object[] propertyValues = meta.getPropertyValues(entity, getEntityMode(criteria, criteriaQuery)); 

Ma solution était de composer un Criteria avec l'objet exemple (suite à la question initiale):

Criteria crit = getSession().createCriteria(File.class); 
Example ex = Example.create(exampleInstance); 
crit.add(ex).add(Restrictions.eq("user", exampleInstance.getUser())); 
return crit.list(); 
Questions connexes