Critères d’Hibernation: Connexion à une table sans association mappée

Je voudrais utiliser l’api de critères d’Hibernate pour formuler une requête particulière qui relie deux entités. Disons que j’ai deux entités, Pet and Owner avec un propriétaire possédant de nombreux animaux de compagnie, mais cette association n’est pas cruciale dans les annotations Java ou xml.

Avec hql, je pourrais sélectionner des propriétaires qui ont un animal de compagnie appelé «fido» en spécifiant la jointure dans la requête (plutôt que d’append un jeu d’animaux à la classe propriétaire).

Peut-on faire la même chose en utilisant les critères d’hibernation? Si c’est le cas, comment?

Merci J

Je crois comprendre que si vous utilisez HQL, vous créez une jointure cartésienne avec un filtre plutôt qu’une jointure interne. Les requêtes de critères ne supportent pas cela.

Ceci est en effet possible avec des critères:

DetachedCriteria ownerCriteria = DetachedCriteria.forClass(Owner.class); ownerCriteria.setProjection(Property.forName("id")); ownerCriteria.add(Ressortingctions.eq("ownername", "bob")); Criteria criteria = getSession().createCriteria(Pet.class); criteria.add(Property.forName("ownerId").in(ownerCriteria)); 

Mise à jour : cette opération effectue 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.

Dans NHibernate, vous pouvez utiliser des sous-requêtes définies comme DetachedCriteria. Vous ne savez pas si cela fonctionne de la même manière en Java, le plus probablement c’est la même chose:

 DetachedCriteria pets = DetachedCriteria.For("pet") .SetProjection(Projections.Property("pet.ownername")) .Add(/* some filters */ ); session.CreateCriteria(typeof(Owner)) .Add(Subqueries.PropertyIn("name", pets); 

Supposons qu’il soit joint en utilisant le nom du propriétaire.

 Criterion ownerCriterion = Ressortingctions.sqlRessortingction(SELECT ownerId FROM Owner WHERE ownerName ='bob'); Criteria criteria = getSession().createCriteria(Pet.class); criteria.createCriteria("ownerId").add(ownerCriterion); 

Il y a un SQLCriterion , que vous pouvez donner en SQL arbitraire et append à vos Criteria . Dans la chaîne SQL , le jeton {alias} “sera remplacé par l’alias de l’entité racine”.