Присоединяйтесь к ассоциации несколько раз с разными псевдонимами - PullRequest
5 голосов
/ 05 октября 2011

Я думаю, что проблема, которая у меня есть, - это ошибка в Hibernate (уже отслежена - https://hibernate.onjira.com/browse/HHH-879).

У меня вопрос: есть ли обходной путь для многократного объединения таблицы с запросом критерия Grails?

SQL будет прямым:

SELECT s FROM Store AS s   
    INNER JOIN s.Products AS prod1  
    INNER JOIN s.Products AS prod2  
WHERE 
    prod1.Type = 'Shoes'   
AND 
    prod2.Type = 'Shirts' 

Когда я использую «createAlias» в запросе критериев Grails (один для prod1 и один для prod2), я получаю следующую ошибку:

org.hibernate.QueryException: повторяющийся путь ассоциации: studyTags ...

Одной из возможностей может быть выполнение запроса с помощью ИЛИ (один-единственный JOIN и WHERE prod.Type = 'Shoes' ИЛИ ​​'Shirts'), а затем фильтрация набора результатов. Проблема с этим решением состоит в том, что если я укажу ограничение для запроса критериев (максимум результатов), реальный результат (после фильтрации) может иметь меньше записей, чем указано.

Любая помощь будет оценена.

Спасибо.

PS: Мой настоящий код, где я столкнулся с этой проблемой, довольно сложный. Чтобы устранить проблему, я использовал этот пример с Store и Product ... Я думаю, что запрос будет выглядеть как

Store.withCriteria{
    createAlias('products', 'prod1')
    createAlias('products', 'prod2')

    and{
        eq('prod1.Type', 'Shoes')
        eq('prod2.Type', 'Shirts')
    }
}

Ответы [ 2 ]

0 голосов
/ 28 января 2017

Хотя это старый вопрос, я вошел в него при поиске своего решения. Поэтому я понял, что в hibernate, вероятно, есть ошибка, которая делает дубликаты псевдонимов невозможными. Обходной путь, который я использовал, - это использование чистого SQL для поиска списка ограниченных идентификаторов и проверки соответствия других запросов запросам. В этом примере это может быть

select x.id from XTable x join products prod1 on... join products prod1 on... where prod1.type= 'shoes' and prod.type = 'shirts';

и затем проверьте

select x.id from XTable x where x.id in ("result of the query")
0 голосов
/ 05 октября 2011

Вы пробовали это - я думаю, что это вернет все магазины, которые содержат как товар типа "Обувь", так и "Рубашки"

Store.withCriteria{
    createAlias('products', 'prod')

    and{
        eq('prod.Type', 'Shoes')
        eq('prod.Type', 'Shirts')
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...