2016-09-12 4 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'd 수표에 성공 TYPE_ID 않을된다

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

그러나, 이것은 SQL과 결합 단 하나의 생성처럼 현재 기준의 관련 부분이 보인다 4 및 = 5 ...

실제로 제가 원하는 것은 product_data에 대한 두 개의 내부 조인입니다. 그러나이를 강제하는 방법을 알 수는 없습니다. 중복 연결 경로 : productData

여러가 같은 테이블에 조인해야하는 이유

답변

0

확실 이 org.hibernate.QueryException했다 -

나는 ("$ {인덱스} 제품", "productData") CREATEALIAS 시도 ? 질문을 제대로 이해하면 디버그는 .ID 그래서 여러 조인을하고 싶어하면 또 다른

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

가입 추가 취득을 시도하기 때문에

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 다른 가입해야 할 수 있습니다 전원을 껐다가는 다음 someDomain에 연결되어 productData을 찾고 질문

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" 

에서 제안으로 다시 confir 다음 전체 ProductData as pd2과를 찾고 HQL에서 pd2.something = pd.something

사용 쉼표의이 아닌 기존 쿼리에 관한 새로운 검색됩니다 밍 ..

+0

나는 criteria 질의하지 HQL에서이 작업을 수행하기 위해 노력하고있어. HQL에서 작동하도록 할 수는 있지만, 이것은 루프로 만들어져 있습니다 (그래서 같은 테이블에 더 많은 조인이 필요할 수도 있습니다). a.value와 b.type을 일치시키기 위해 a.type이 필요하기 때문에 b.value ... a.type에 b.value를 사용할 수 없기 때문에 두 개의 "ins"가 작동하지 않습니다. 예 : 셔츠 [녹색 : – Trebla

+0

... 또는 내 샘플 데이터 [4 : GC, 5 : P1]를 사용하여 someDomains를 검색하는 경우 [셔츠 : 파란색, 바지 : 녹색]로 인해 잘못된 ProductData가 표시됩니다. 나는 값 GC와 타입 5, 값 P1을 가진 타입 4의 제품을 가진 someDomains을 필요로한다. 해결책을 찾으면 타입 4, 값 P1의 someDomains가 정확하지 않을 것입니다. – Trebla

+0

HQL에서 쿼리를 찾으려고 할 수도 있습니다. (요즘 대부분 사용하고 있기 때문에) 그러나 쿼리를 원할 때 말입니다. 개인적으로 나는 큰 차이를 볼 수 없다. 생성 된 기본 쿼리는 닫히거나 비슷합니다. 당신이 그것에 대한 전문가를 필요로 할 것 같아요. 행운을 빕니다. – Vahid