我在层次结构中有4个实体,如下所示:
Parent
|
------------------------
| | |
Child1 Child2 Child3
我有兴趣使用单个查询中的条件检索Child1和Child2的所有实例(但不是Child3实例)。
使用HQL(或JPQL)很容易,如下所示:
FROM Parent obj
WHERE obj IN (FROM Child1 where fieldOfChild1="aa") OR
obj IN (FROM Child2 where fieldOfChild2=55)
我研究过Hibernate Criteria和JPA Criteria API,我找不到将此查询表达为条件的方法。
这是Criteria API的限制吗?还是只是我错过了路?任何提示?
答案 0 :(得分:1)
如果您的映射中的每个子类都有一个鉴别器值(例如,1表示Child1,2表示Child2,3表示Child3),您可以在HQL / Criteria中使用特殊属性“class”。
所以标准查询可以是这样的:
session.createCriteria(Parent.class)
.add(Restrictions.or(Restrictions.eq("class", 1),
Restrictions.eq("class", 2)))
简化了您的HQL查询:
FROM parent WHERE class = 1 OR class = 2
答案 1 :(得分:-1)
嗯,你说你没有在评论中映射你的班级层次结构,对吗?
因此无法使用Criteria构建对Child1和Child2的查询。事实上,我认为您的HQL示例不起作用,因为未映射Parent。
一个丑陋的解决方案是查询次数,Child1的Criteria查询和Child2的另一个Criteria查询。然后在java代码中合并两个结果列表:( 或映射层次结构:)