2016-09-12 2 views
0

Ich habe ähnliche Fragen, aber keine Antworten gefunden.Grails 2.5.1 (Hibernate 3) Kriterien mehrere Joins zur gleichen Tabelle

class SomeDomain { 
    static hasMany= [productData:ProductData] 
} 

Produktdaten ist einfacher Typ/Wert-Paar

Ich versuche, alle SomeDomains zu finden, die mehrere Produkte eines bestimmten Typs haben (in einer Schleife). Zur Zeit der relevante Teil der Kriterien wie folgt aussieht:

SomeDomain.createCriteria.list { 
    somedata.each { type, value -> 
    productData { 
     eq("type", type) 
     eq("value", value) 
    } 
    } 
} 

Dies ist jedoch nur eine einzige Join mit dem SQL erzeugt:

from some_domain this_ inner join product_data productdata_a1_ on this_.id=productdata_a1_.some_domain_id 
where (productdata_a1_.type_id=4 and productdata_a1_.value='GC') 
and (productdata_a1_.type_id=5 and productdata_a1_.value='P1') 

offensichtlich type_id nie = auf verknüpft, überprüft, um folgen gehen 4 und = 5 ...

Was ich wirklich gerne hätte, sind zwei innere Verknüpfungen zu product_data ... kann aber nicht herausfinden, wie man das erzwingt.

Ich versuchte Create ("Produktdaten", "Produkt - $ {index}") gab diese org.hibernate.QueryException: doppelten Pfad Verein: Produktdaten

Antwort

0

Ungewiss warum Sie mehr müssen gleiche Tabellen-Joins ? Falls die Frage zu verstehen ist richtig

String query="from someDomain sd join productData pd where pd.type in (:types) and pd.value in (:values) " 
def inputParams=[:] 
inputParams.values=['GC','P1'] 
inputParams.types=[4,5] 
List resultsList = SomeDomain.executeQuery(query,inputParams,[readOnly:true,timeout:15]) 

pd.type haben zu einem anderen verbinden, da in dem Debug sein kann versucht es, die .id zu bekommen, so ein anderer

String query="from someDomain sd join productData pd join pd.types tp where tp.id in (:types) and pd.value in (:values) " 

beitreten hinzufügen Wenn Sie mehrere Verknüpfungen machen wollte wie in der Frage vorgeschlagen

String query="from someDomain sd join productData pd join pd.types tp, ProductData pd2 where tp.id in (:types) and pd.value in (:values) and pd2.something=pd.something" 

die dann abgehend und suchen Produktdaten, die wieder zu somedomain verknüpft sucht dann ganze ProductData as pd2 und dann confir wo ming pd2.something = pd.something

Mit Kommas in HQL eine neue Lookup wird nicht vorhandene Abfrage im Zusammenhang ..

+0

Ich versuche, dies in einer Kriterien-Abfrage zu tun, nicht HQL. Ich kann es in HQL arbeiten lassen, aber das ist in einer Schleife (so brauche ich möglicherweise mehr Joins in der gleichen Tabelle). Zwei "ins" werden nicht funktionieren, weil ich a.type brauche, um a.value und b.type so anzupassen, dass sie b.value ... entsprechen. A.type kann nicht mit b.value ausgerichtet werden. Zum Beispiel würde [Hemd: blau, Hose: grün] mir fehlgeleitete Produktdaten geben, wenn ich nach etwas suchen würde, das Hemd hatte: grün – Trebla

+0

... oder meine Beispieldaten verwendend [4: GC, 5: P1]. Ich brauche einige Domains, die Produkt vom Typ 4, mit Wert GC und Typ 5, Wert P1 haben. Die in Lösung würde mir einige Domains mit Typ 4, Wert P1 geben, der nicht korrekt ist. – Trebla

+0

Ich könnte versuchen, eine Abfrage für Sie in HQL herauszufinden (da dies ist, was ich die meiste Zeit in diesen Tagen verwende), aber wie Sie sagen, Sie wollen es für die Kriterienabfrage. Persönlich kann ich den Hauptunterschied nicht sehen. Die zugrunde liegenden Abfragen werden quote nahe/ähnlich sein. Wenn Sie eine Kriterienabfrage brauchen, brauchen Sie einen Experten. Viel Glück. – Vahid

Verwandte Themen