hibernate criteria - 查询 n:m 关系中的表
-
03-07-2019 - |
题
我正在尝试为以下场景构建具有休眠条件的查询:
- 两个实体:指标和报告(每个都有自己的表格、类别等)
- 一个指标可以在零到多个报告中使用
- 报告使用零到多个指标
- 因此,我有一个交集表来存储关系
- 该关系在两个类及其休眠映射中定义
- 在用户界面中,用户可以选择一个或多个报告(除其他外),我想在数据库中查询这些报告中使用的指标
我尝试过以下方法:
criteria.add(Restrictions.in("Reports", selectedReports));
但我得到的只是一个奇怪的 SQL 语句
where this_.Indicator_ID in (?)
然后是 JDBC 异常(缺少参数)
有任何想法吗?谢谢。
笔记:我调查过 使用 Hibernate Criteria 查询多对多关系, ,但公认的解决方案是构建自定义 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
以及来自 Spring 论坛:
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 所建议的,我添加的只是从传递的 Collection 中构建标准的析取。
剩下要做的就是尝试直接使用该集合......