Hibernate: запрос по примеру эквивалент запроса критериев ассоциации

Я хотел бы найти в моем источнике данных все экземпляры объекта на основе значений объекта, связанного ассоциацией. Модель данных можно упростить до следующего: объект типа A содержит список объектов типа B. Цель состоит в том, чтобы найти все экземпляры A, где A содержит B, так что B имеет значение свойства X.

Я уже могу успешно добиться этого, используя следующие запросы критериев:

  List<A> results = session.createCriteria(A.class)
    .createCriteria("listOfBs")
    .add(Restrictions.eq("propertyInB", x))
    .list();

Это упрощение, и будут применяться несколько свойств B - функция поиска необходима для фильтра, заполняемого пользователем.

Я хотел бы заменить этот подход запросом на пример - где я просто создал бы граф объектов с желаемыми параметрами. Моя попытка следовать документам Hibernate не удалась и описана в this вопрос.

Я подумал, что было бы полезно продемонстрировать, чего я пытаюсь достичь, и затем искать эквиваленты - вот почему я снова задаю вопрос.

Короче говоря, мой вопрос: как бы вы реализовали вышеуказанный критерий критериев как запрос по примеру в Hibernate? Я использую Hibernate 3.6.6.

Спасибо!


person filip-fku    schedule 23.11.2011    source источник


Ответы (1)


Предположим, вы хотите сделать что-то вроде:

Select a.* , b* 
from a join b on a.id = b.id 
where a.property1 = "wwww"
and a.property2="xxxx"
and b.property1="yyyy"
and b.property2="zzzz"

Чтобы реализовать вышеуказанный запрос с помощью Query by Example (QBE):

/***Initialize an instance of Class A with the properties that you want to match***/
A instanceA = new A();
instanceA.setProperty1("wwww");
instanceA.setProperty2("xxxx"); 
Example exampleA = Example.create(instanceA);

/***Do the same for the Class B**/
B instanceB = new B();
instanceB.setProperty1("yyyy");
instanceB.setProperty2("zzzz"); 
Example exampleB = Example.create(instanceB);

/**Create and execute the QBE***/
List<A> results = session.createCriteria(A.class)
    .add(exampleA)
    .createCriteria("b",CriteriaSpecification.LEFT_JOIN) // b is the property of Class A
    .add(exampleB)
    .list();

Результат уже присоединен к выборке, что означает, что экземпляр коллекции B в A уже полностью инициализирован.

person Ken Chan    schedule 23.11.2011
comment
Спасибо за ответ, Кен. Я пробовал это, но столкнулся с теми же проблемами, что и в предыдущем вопросе (stackoverflow.com/questions/7976491/) - org.hibernate.QueryException: не удалось разрешить свойство: _com of B. Вы могли бы иметь какое-нибудь представление что может пойти не так? - person filip-fku; 24.11.2011
comment
Я понятия не имею сейчас. Обычно, если вы указываете в коде недопустимый путь, например .createCriteria("_com",CriteriaSpecification.LEFT_JOIN), а _com не является свойством вашей сущности, то возникает could not resolve property. - person Ken Chan; 24.11.2011
comment
К сожалению, _com - это не свойство / поле, которое я нигде определил, и это не работает для меня. Кроме того, _com не является именем свойства, которое существует в какой-либо из библиотек, включенных в мою рабочую область .. Однако это то, что документ предлагает сделать для QBE, поэтому я отмечу это как ответ .. Мне нужно идти без QBE вроде. - person filip-fku; 28.11.2011