критерии спящего режима – запрос таблиц в отношении n:m
-
03-07-2019 - |
Вопрос
Я пытаюсь создать запрос с критериями спящего режима для следующего сценария:
- Две сущности:Индикатор и отчет (каждый со своими таблицами, классами и т. д.)
- индикатор можно использовать во многих отчетах
- в отчете используется от нуля до многих показателей
- поэтому у меня есть таблица пересечений для хранения отношений
- отношения определены как в классах, так и в их отображениях спящего режима.
- в пользовательском интерфейсе пользователь может выбрать один или несколько отчетов (среди прочего), и я хотел бы запросить в БД индикаторы, используемые в этих отчетах.
Я пробовал следующее:
criteria.add(Restrictions.in("Reports", selectedReports));
но все, что я получаю, это странный оператор SQL с
where this_.Indicator_ID in (?)
а затем исключение JDBC (отсутствует параметр)
Есть идеи?Спасибо.
Примечание:я изучил Запрос отношения ManyToMany с критериями Hibernate, но принятое решение - создать собственную sql-строку...
Решение
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
Другие советы
Если вам необходимо, вот несколько предложений, которые Google выдал после поиска «hibernate hql многие-ко-многим»:
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
Надеюсь, это поможет.
На данный момент у меня это работает так (спасибо zmf).
Criteria subcrit = criteria.createCriteria("Reports");
Disjunction dis = Restrictions.disjunction();
for (Reports r : selectedReports) {
dis.add(Restrictions.idEq(r.getID()));
}
subcrit.add(dis);
Это почти в точности то, что предложил zmf, все, что я добавил, это разделение для построения критериев из передаваемой коллекции.
Остается только попытаться использовать коллекцию напрямую...