2016-09-12 15 views
0

Я нашел похожие вопросы, но ответов нет.Grails 2.5.1 (hibernate 3) критерии множественных объединений в один стол

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

ИзделиеТехнический просто тип/значение пары

Я пытаюсь найти все SomeDomains, которые имеют несколько продуктов определенного типа (в цикле). В настоящее время соответствующая часть критериев выглядит следующим образом:

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

Однако, это создает только один присоединиться к SQL:

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

очевидно type_id никогда не собирается добиться успеха на and'd проверяет = 4 и = 5 ...

Что мне действительно нужно, так это два внутренних присоединения к product_data ... не могу понять, как это сделать.

Я попытался createAlias ​​("ИзделиеТехнический", "продукт - $ {индекс}") это дало org.hibernate.QueryException: дублированный путь ассоциации: ИзделиеТехнический

ответ

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, возможно, придется еще один присоединиться, так как в отладке он пытается получить .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 join pd.types tp, ProductData pd2 where tp.id in (:types) and pd.value in (:values) and pd2.something=pd.something" 

Это затем поднятие и смотрит ИзделиеТехнические, связанные с someDomain затем снова смотрю весь ProductData as pd2, а затем confir мина где pd2.something = pd.something

Использование запятая годов в HQL становится новым поиск не связан с существующим запросом ..

+0

Я пытаюсь сделать это в критерии запроса, а не HQL. Я могу заставить его работать в HQL, но он построен в цикле (так что мне может понадобиться больше объединений в одну таблицу). Два «ins» не будут работать, потому что мне нужен a.type для выравнивания a.value и b.type для соответствия b.value ... не может иметь a.type, выравнивающийся с b.value. Например, [рубашка: синяя, брюки: зеленая] дала бы мне странную ProductData, если бы я искал некоторых Доменов, у которых была рубашка: зеленый – Trebla

+0

... или с использованием данных моего образца [4: GC, 5: P1]. Мне нужны некоторые Домены, у которых есть продукт типа 4, со значением GC и тип 5, значение P1. В решении мне дали бы некоторые Домены с типом 4, значение P1, что неверно. – Trebla

+0

Я мог бы попытаться вычислить запрос для вас в HQL (так как это то, что я использую большую часть времени в эти дни), но, как вы говорите, вы хотите его для запроса критериев. Лично я не вижу большой разницы. Созданные базовые запросы будут цитироваться close/similar. Если вам нужен запрос на критерии, я думаю, вам понадобится эксперт по этому вопросу. Удачи. – Vahid