2010-06-04 13 views
5

ich habe zwei in einer one-to-many Beziehung verknüpft benannten Entitäten Eltern und Kind. Die untergeordnete Entität verfügt über eine boolesche isStudent-Eigenschaft.Hibernate Kriterien und Zeilenanzahl Einschränkung

Wie erhalte ich mithilfe der Hibernate Criteria API alle übergeordneten Entitäten, die mindestens ein untergeordnetes Element mit isStudent = true haben?

Ich habe versucht, ein Projection -Objekt zu verwenden, um alle Eltern zu zählen, die mindestens ein Kind mit der Eigenschaft richtig gesetzt haben, und dann diejenigen, deren Zeilenanzahl größer als Null ist, wie im folgenden Stück Code (die obwohl nicht funktioniert):

Criteria criteria = getCurrentSession().createCriteria(Parent.class); 

criteria.setProjection(Projections.alias(Projections.rowCount(), "count")) 
.add(Restrictions.gt("count", 0)).createCriteria("children") 
.add(Restrictions.eq("isStudent", true)); 

Danke für Ihre Hilfe

Antwort

9

Dieser arbeitete für mich:

DetachedCriteria crit   = DetachedCriteria.forClass(Parent.class, "theparent"); 
DetachedCriteria countSubquery = DetachedCriteria.forClass(Child.class , "child" ); 

countSubquery 
    .add(Property.forName("theparent.id").eqProperty("parent.id")) 
    .setProjection(Projections.count("id")); 

crit.add(Subqueries.lt(Long.valueOf(0), countSubquery)); 

[Edit: Es wurde ein Programmfehler von @brabene wies darauf hin, tz]

Wo gibt es eine bidirektionale Beziehung zwischen Eltern und Kind, d. h. das Kind hat ein Feld "Eltern" Es gibt die Eltern, die> 0 Kinder haben.

1

Die Antwort von RobAu ist fast das, was wir brauchten. Aber es ist ein kleiner Fehler darin: anstelle von Unterabfragen. GT (..) Sie benötigen Unterabfragen. lt (...)

crit.add(Subqueries.lt(Long.valueOf(0), countSubquery)); 
+0

fühlt sich nach hinten, aber es funktioniert! –