Question

J'essaie de créer une requête avec des critères de veille prolongée pour le scénario suivant:

  • Deux entités: indicateur et rapport (chacun avec ses propres tables, classes, etc.)
  • un indicateur peut être utilisé dans zéro à plusieurs rapports
  • un rapport utilise zéro à plusieurs indicateurs
  • donc, j'ai une table d'intersection pour stocker la relation
  • la relation est définie dans les deux classes et leurs mappages d'hibernation
  • dans l'interface utilisateur, l'utilisateur peut sélectionner un ou plusieurs rapports (entre autres), et j'aimerais interroger le DB pour les indicateurs utilisés dans ces rapports

J'ai essayé les solutions suivantes:

criteria.add(Restrictions.in("Reports", selectedReports));

mais tout ce que je reçois est une déclaration SQL étrange avec

where this_.Indicator_ID in (?)

puis une exception JDBC (paramètre manquant)

Des idées? Merci.

Remarque: j'ai consulté Interrogation de ManyToManyrelation avec des critères d'hibernation , mais la solution acceptée est de construire une chaîne sql personnalisée ...

Était-ce utile?

La solution

  Criteria c = session.createCriteria(Indicator.class);
    c.add(Restrictions.eq("someField", myObject).createCriteria("reports")
    .add(Restrictions.eq("reportName", name);
    c.list();

Vous devez créer un sous-critère pour l'entité qui est détenue dans une collection sur une autre entité.

String[] selectedReportsId = {"1", "2", "3"};
 c.add(Restrictions.eq("someField",myObject).createCriteria("reports")
    .add(Restrictions.in("id", selectedReportsId);

Vérifiez ensuite comment transformer les résultats à partir d’ici: https: // docs. jboss.org/hibernate/orm/3.3/reference/en-US/html/querycriteria.html#querycriteria-associations

Cela peut également nous éclairer sur ce que vous pouvez faire avec les critères: http://www.hibernate.org/hib_docs/ v3 / api / org / hibernate / critère / Restrictions.html

Autres conseils

Si vous devez le faire, voici quelques suggestions avec lesquelles Google est revenu après avoir recherché "hibernate hql plusieurs-à-plusieurs":

http://patf.net /blogs/index.php?blog=2&c=1&more=1&pb=1&tb=1&title=many_to_many_in_hql

Et sur les forums Hibernate:

http://forum.hibernate.org/viewtopic.php?pf = 2340747 & amp = s4 = d4c8d2fcc16aed0201f73eb74619692a

Et des forums de printemps:

http://forum.springframework.org/showthread.php?t=36870

J'espère que cela vous aidera.

Pour l'instant, voici comment je l'ai fait fonctionner (grâce à zmf).

Criteria subcrit = criteria.createCriteria("Reports");
Disjunction dis = Restrictions.disjunction();
for (Reports r : selectedReports) {
    dis.add(Restrictions.idEq(r.getID()));
}
subcrit.add(dis);

C’est presque exactement ce que suggérait zmf. Tout ce que j’ai ajouté, c’est la disjonction qui permet de construire les critères à partir de la collection transmise.

Il ne reste plus qu'à essayer d'utiliser la collection directement ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top