Критерии гибернации - запрос таблиц в соотношении n: m - PullRequest
0 голосов
/ 02 января 2009

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

  • Два объекта: индикатор и отчет (каждый со своими таблицами, классами и т. Д.)
  • индикатор может использоваться в нуле для многих отчетов
  • в отчете используется ноль ко многим показателям
  • поэтому у меня есть таблица пересечений для хранения отношения
  • отношения определены в обоих классах и их отображениях в спящем режиме
  • в пользовательском интерфейсе пользователь может выбрать один или несколько отчетов (среди прочего), и я хотел бы запросить в БД индикаторы, используемые в этих отчетах

Я пробовал следующее:

criteria.add(Restrictions.in("Reports", selectedReports));

но все, что я получаю, это странный оператор SQL с

where this_.Indicator_ID in (?)

и затем исключение JDBC (отсутствует параметр)

Есть идеи? Спасибо.

Примечание. Я рассмотрел Запрос множества связей с Hibernate Criteria , но здесь принято решение создать пользовательскую строку SQL ...

Ответы [ 3 ]

4 голосов
/ 02 января 2009
  Criteria c = session.createCriteria(Indicator.class);
    c.add(Restrictions.eq("someField", myObject).createCriteria("reports")
    .add(Restrictions.eq("reportName", name);
    c.list();

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

String[] selectedReportsId = {"1", "2", "3"};
 c.add(Restrictions.eq("someField",myObject).createCriteria("reports")
    .add(Restrictions.in("id", selectedReportsId);

Тогда посмотрите немного о преобразовании результатов: https://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/querycriteria.html#querycriteria-associations

Также это может пролить некоторый свет на то, что вы можете сделать с критериями: http://www.hibernate.org/hib_docs/v3/api/org/hibernate/criterion/Restrictions.html

0 голосов
/ 03 января 2009

На данный момент, вот как я заставил его работать (спасибо zmf).

Criteria subcrit = criteria.createCriteria("Reports");
Disjunction dis = Restrictions.disjunction();
for (Reports r : selectedReports) {
    dis.add(Restrictions.idEq(r.getID()));
}
subcrit.add(dis);

Это почти точно то, что предложил zmf, все, что я добавил, - это дизъюнкция для построения критериев из коллекции, которая передается.

Осталось только попробовать использовать коллекцию напрямую ...

0 голосов
/ 02 января 2009

Если необходимо, вот несколько советов, которые Google вернулся после поиска «hibernate hql many-to-many»:

http://patf.net/blogs/index.php?blog=2&c=1&more=1&pb=1&tb=1&title=many_to_many_in_hql

А с форумов Hibernate:

http://forum.hibernate.org/viewtopic.php?p=2340747&sid=d4c8d2fcc16aed0201f73eb74619692a

А с весенних форумов:

http://forum.springframework.org/showthread.php?t=36870

Надеюсь, что это поможет.

...