69 votes

Critères Hibernate: Table de jointure sans association mappée

Je voudrais utiliser Hibernate critères d'api pour formuler une requête qui joint deux entités. Disons que j'ai deux entités, l'Animal et le Propriétaire avec un propriétaire ayant de nombreux animaux domestiques, mais, aussi et surtout, que l'association n'est pas référencée dans les annotations Java ou xml.

Avec hql, j'ai pu sélectionner les propriétaires qui ont un animal de compagnie appelé "fido" en spécifiant le rejoindre dans la requête (plutôt que d'ajouter un ensemble d'animaux de compagnie pour le titulaire de classe).

Peut même être fait en utilisant hibernate critères? Si oui, comment?

Merci, J

77voto

Pierre Pretorius Points 950

Ceci est en effet possible avec les critères:

 DetachedCriteria ownerCriteria = DetachedCriteria.forClass(Owner.class);
ownerCriteria.setProjection(Property.forName("id"));
ownerCriteria.add(Restrictions.eq("ownername", "bob"));

Criteria criteria = getSession().createCriteria(Pet.class);
criteria.add(Property.forName("ownerId").in(ownerCriteria));
 

Mise à jour : Ceci effectue en réalité une sous-requête au lieu d'une jointure, mais vous permet d'utiliser des critères sur deux entités pour lesquelles aucune relation d'hibernation n'est définie.

61voto

David M Points 45808

D'après ce que je comprends, si vous utilisez HQL pour cela, vous créez une jointure cartésienne avec un filtre plutôt qu'une jointure interne. Les requêtes de critères ne prennent pas en charge cette opération.

1voto

Stefan Steinegger Points 37073

Dans NHibernate, vous pouvez utiliser des sous-requêtes définies en tant que DetachedCriteria. Je ne sais pas si cela fonctionne de la même manière en Java, mais probablement la même chose

 DetachedCriteria pets = DetachedCriteria.For<Pet>("pet")
  .SetProjection(Projections.Property("pet.ownername"))
  .Add(/* some filters */ );

session.CreateCriteria(typeof(Owner))
  .Add(Subqueries.PropertyIn("name", pets);
 

Supposé qu'il est rejoint en utilisant le nom du propriétaire.

-2voto

tpdi Points 18427

Il existe un critère SQLC, que vous pouvez donner à un code SQL arbitraire et ajouter à vos critères. Dans la chaîne SQL, le jeton {alias} "sera remplacé par l'alias de l'entité racine".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X