2016-09-12 15 views
0

私は同様の質問を見つけましたが、回答はありません。Grails 2.5.1(hibernate 3)criteria複数のテーブルを同じテーブルに結合

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

ProductDataは、私は(ループで)特定のタイプの複数の製品を持っているすべてのSomeDomainsを見つけようとしている単純型/値のペア

です。現在の基準の該当部分を以下のようになります。

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') 

は明らかに=のためでANDチェックに成功するTYPE_IDつもりはありません:

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

しかし、これは、SQLでの参加のみシングルを生成し、 4と= 5 ...

私が本当に好きなのは、product_dataへの2つの内部結合です...しかし、これを強制する方法を理解することはできません。

私は createAlias( "productData"、 "製品 - $ {インデックス}")しようとした、これは org.hibernate.QueryException与えた を:あなたは、複数の同じテーブルに参加する必要がある理由productData

答えて

0

わからない:重複アソシエーションパスを?質問が理解されている場合、正しく

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は、デバッグ中に、それはあなたが複数の結合やってみたかったので、もし別の

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

に参加追加.IDを取得しようとするので、他の参加する必要がありその後、confirその後、オフに行くとproductDataを探してsomeDomainにリンクされていることを再度全体ProductData as pd2を見上げるとされる問題

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" 

で提案されているようにHQLでのコンマのを使用してpd2.something = pd.something

は、既存のクエリに関連していない新しいルックになっ明..

+0

私は基準クエリではなく、HQLでこれをやろうとしています。私はHQLで動作させることができますが、これはループで構築されています(したがって、同じテーブルにもっと多くの結合が必要な場合があります)。 a.valueとb.typeを一致させるためにa.typeが必要なので、2つの "ins"は機能しません... b.valueで一続きのa.typeを持つことはできません。シャツ:緑色の – Trebla

+0

...またはサンプルデータ[4:GC、5:P1]を使用しているsomeDomainsを検索していた場合など、[シャツ:青、ズボン:緑]で誤ったProductDataが表示されます。私は、値GCとタイプ5、値P1のタイプ4の製品を持つsomeDomainsが必要です。解決策では、タイプ4のsomeDomains、値P1が正しくないことがわかります。 – Trebla

+0

私はHQLであなたのための質問を見つけようとすることができました(これは私がこれらの時間の大半を使っているからです)。個人的に私は大きな違いは見えません。作成される基本クエリーは、近い/類似したクォートになります。あなたがそれについての専門家のために必要とすると思う基準照会が必要な場合。がんばろう。 – Vahid

関連する問題