Grails 2.5.1 (hibernate 3) оценивает множественные объединения в одну таблицу
Я нашел похожие вопросы, но ответов нет.
class SomeDomain {
static hasMany= [productData: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 никогда не будет успешным и будет проверять =4 и =5...
Что мне действительно нравится, так это два внутренних соединения с product_data... но я не могу понять, как это заставить.
Я пытался создать createAlias ("productData", "product-${index}"), что дало org.hibernate.QueryException: дубликат пути ассоциации: productData
1 ответ
Не знаете, почему вам нужно несколько объединений к одной таблице? если вопрос правильно понят
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"
Затем происходит поиск данных продукта, связанных с каким-то доменом, и снова поиск всего ProductData as pd2
а затем подтверждая, где pd2.something = pd.something
Использование запятых в HQL становится новым поиском, не связанным с существующим запросом.