Написание Hibernate Criteria API Query с ограничениями для нескольких подэлементов - PullRequest
2 голосов
/ 21 апреля 2011

У меня есть модель данных, которая выглядит следующим образом (упрощенный пример):

public class Address { private List<AddressLine> addressLines; }

public class AddressLine { private String value; private String type; }

Я пытаюсь использовать Criteria API для поиска адресов в базе данных, которая содержит определенные комбинации AddressLines.Например, чтобы извлечь все адреса, содержащие адресные строки {(type = "CITY", value = "London"), (type = "COUNTRY", value = "GB")}.Я не смог найти ни одного примера такого запроса.

Насколько мне удалось получить, это запросить адрес на основе одной AddressLine.

session.createCriteria(Address.class) .createCriteria("addressLines") .add(Restrictions.and(Restrictions.eq("type", type), Restrictions.eq("value", value))).list()

Если я добавлю ограничение для второй адресной строки, SQL, который генерирует hibernate, в основном запрашивает SELECT x WHERE xy = 'a' AND xy = 'b', поэтому никогда не вернет никаких результатов.

Я обнаружил, что подобные вопросы задавались ранее, но ни один из них не получил или проголосовал за ответ.

1 Ответ

1 голос
/ 21 апреля 2011

Вам необходимо написать критерий, эквивалентный

select a from Address a where 
    exists (select line1.id from AddressLine line1 where line1.address.id = a.id 
                                                     and line1.type = 'CITY'
                                                     and line1.value = 'London')
    and exists (select line2.id from AddressLine line where line2.address.id = a.id 
                                                        and line2.type = 'COUNTRY'
                                                        and line2.value = 'GB')

Это означает написание DetachedCriteria для каждого подзапроса с проекцией id и использование этих отдельных критериев в качестве аргумента двух вызовов Subqueries.exists(). Псевдоним объекта адреса в основных критериях может использоваться в отдельных критериях для реализации ограничения line1.address.id = a.id.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...