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 становится новым поиском, не связанным с существующим запросом.

Другие вопросы по тегам