Hibernate: Query By Example эквивалент ассоциации Критерии Query - PullRequest
4 голосов
/ 23 ноября 2011

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

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

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

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

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

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

Спасибо!

1 Ответ

6 голосов
/ 23 ноября 2011

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

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 уже полностью инициализирован.

...