2009-06-19 23 views
0

Ich möchte eine Abfrage bilden, wo eine zugeordnete Sammlung wurde eingeschränkt, idealerweise mit Hibernate Kriterien oder HQL, aber ich wäre interessiert, wie dies in SQL zu tun. Angenommen, ich habe eine Boy Klasse mit einer bidirektionalen Eins-zu-viele-Verknüpfung zur Kites-Klasse. Ich möchte eine Liste der Jungen bekommen, deren Drachenlängen in einer Reichweite sind.Abfrage für die Einschränkung verknüpfter Entitäten

Das Problem ist, dass die HQL/Kriterien Ich weiß, macht mich nur Boy Objekte mit einem kompletten (frei) Satz von Kites, wie in diesen beiden Beispiele gegeben (die HQL ist eine Vermutung). Das heißt, ich bekomme die Jungs, die Drachen im richtigen Bereich haben, aber für jeden solchen Jungen bekomme ich alle der Drachen, nicht nur die in der Reihe.

select new Boy(name) from Boy b 
     inner join Kite on Boy.id=Kite.boyId 
      where b.name = "Huck" and length >= 1; 

Criteria crit = session.createCriteria(Boy.class); 
crit.add(Restrictions.eq("name", "Huck")) 
    .createCriteria("kites") 
    .add(Restrictions.ge("length", new BigDecimal(1.0))); 
List list = crit.list(); 

Im Augenblick ist die einzige Art, wie ich die richtigen Kite Länge Sets bekommen haben, ist durch die Liste der Jungen und für jede eine erneute Abfrage Kites für die, die im Bereich iterieren. Ich hoffe, dass ein SQL/HQL/Kriterien-Assistent einen besseren Weg kennt. Ich würde bevorzugen, eine Kriterienlösung zu erhalten, weil mein wirklicher "Jungen" Erbauer ziemlich viele Argumente hat und es handlich sein würde, die initialisierten Jungen zu haben.

Meine zugrunde liegende Datenbank ist MySQL. Gehen Sie nicht davon aus, dass ich viel über SQL oder Hibernate weiß. Vielen Dank!

Antwort

0

Es stellt sich heraus, dass dies am besten durch die Umkehrung der Verbindung erfolgt:

Criteria crit = session.createCriteria(Kite.class); 
crit.add(Restrictions.ge("length", new BigDecimal(1.0)) 
.createCriteria("boy") 
.add(Restrictions.eq("name", "Huck"))); 
List<Kite> list = crit.list(); 

Beachten Sie, dass die Drachen in die Liste müssen in Jungen aggregiert werden, diese leicht mit einem HashMap getan werden kann.

1

Ich bin kein Hibernate-Experte, aber wie Sie sagen Sie daran interessiert sind in der SQL-Lösung als auch ...:

In SQL, ich nehme an, Sie so etwas wie (mit dem Zusatz von Indizes bedeuten, Schlüssel usw.):

CREATE TABLE Boys (Id INT, Name VARCHAR(16)) 
CREATE TABLE Kites(Length FLOAT, BoyID INT, Description TEXT) 

und natürlich auch andere Spalten & c, die Angelegenheit nicht hier.

Alle Jungen besitzen 1+ Drachen mit lenghts zwischen 1,0 und 1,5:

SELECT DISTINCT Boys.* 
FROM Boys 
JOIN Kites ON(Kites.BoyID=Boys.ID AND Kites.Length BETWEEN 1.0 AND 1.5) 

Wenn Sie auch die Beschreibung die entsprechenden Drachen sehen möchten, mit N Zeilen pro Junge besitzen N solche Drachen:

SELECT Boys.*, Kites.Length, Kites.Description 
FROM Boys 
JOIN Kites ON(Kites.BoyID=Boys.ID AND Kites.Length BETWEEN 1.0 AND 1.5) 

Hoffe jemand kann dir helfen, diese mit hybernate zu integrieren ...!

+0

Danke, das ist ausgezeichnet und hat mich in die richtige Richtung denken lassen. – Glenn

Verwandte Themen