# Hibernate Criteria Queries - Abfragen von Collection-Members



## thomator (5. Jul 2007)

Moinsen,
ich weiß jetzt nicht, ob ich hier im richtigen Board unterwegs bin, falls nein bitte verschieben.

Also zum Problem:
Ich will mittels *Hibernate* Criteria Query alle Objekte abfragen, die in einer Collection (Attribut des Objekts) mehrere (bestimmte) assoziierte Objekte enthalten. Das Aufbauen einer ODER-Beziehung ist kein Problem, nur wenn die Collection mehrere Objekte enthalten muss, sprich UND-Verknüpft.
In den Dokumentationen und Tutorials wird immer nur nach einem Objekt gefragt, aber das reicht mir nicht. Ich habe auch schon ordentlich rumprobiert, allein es mangelt an Erfolg^^.
Kennt sich damit jemand aus und hat einen Lösungsansatz fürmich parat?

PS: Mir ist durchaus bewußt, dass sich mit der Liste der Objekte, die eines der Objekte enthalten, da ganze rekonstruieren lassen würde, aber ich würde schon gern mit Hibernate-Bordmitteln...[/b]


----------



## SlaterB (5. Jul 2007)

kannst du denn überhaupt Sets bei Criterias benutzen?

war hier mal eine Frage:
http://www.java-forum.org/de/viewtopic.php?t=50898
wenn du dazu ein Beispiel hast, nur zu 

---------

ist die Und-Verknüpfung nicht ein allgemeines Problem der SQL-Sprache?

nimm eine Tabelle mit 4 Attributen a, b,c,d, jeweils Inhalt 0 oder 1,
nun willst du alle Elemente mit mindesten zwei 1en,
da bleibt dir doch auch nichts anderes übrig als
(a and b) or (a and c) or ...

evtl. kann man mit DECODE was tricksen?
where (DECODE(a,0,0,1)+DECODE... >1)


----------



## thomator (5. Jul 2007)

Also mit sets zu arbeiten ist eigentlich kein Problem. Da kann man für Sub-Criterias nutzen oder mit Aliasen arbeiten.
Ist in dem Kapitel hier auch ganz gut beschrieben:

querycriteria-associations

Allerdings imer nur für ein Objekt. Wie gesagt, ich hab da bisschen mit experimentiert und eine oder-Abfrage funzt auch. Ich schreibe mir die Hash-Werte der Objekte in einen Integer-Array (intArray), in den Datenobjekten gibt es ein Feld hash, in dem der Hash-Wert gespeichert ist (dient auch als primär-schlüssel in der DB).
Dann das bisschen Code hier (im criterion is der ganze Baum mit den 'simplen' Kriterien abgebildet):

```
Criteria rootCriteria = session.createCriteria(criterion);
Criteria tmpCriteria = rootCriteria.createCriteria(<<hier der Feldname des Collection-Feldes>>);
Junction j = Restrictions.disjunction();
for(int i = 0; i < intArray.langth; i++){
    j.add(Restrictions.eq("hash", intArray[i]));
}
tmpCriteria.add(j);

List list = rootCriteria.list();
```
Und damit hat man alle Objekte, die eines der im intArray 'referenzierten' Objekte in der entsprechenden Collection haben.
Problem ist halt, dass, wenn ich statt disjunction eine conjunction verwenden will, alle Collection-Objekte geprüft werden auf hash=intArray[0] AND hash=intArray[1] usw.

Zur Not muss ich halt dann wirklich die Einträge der List durchlaufen und prüfen, ob alle Kriterien erfüllt sind.


----------

