对Hibernate(和JPA)标准表达能力的限制?

时间:2011-09-08 10:03:58

标签: java hibernate jpa ejb

我在层次结构中有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的限制吗?还是只是我错过了路?任何提示?

2 个答案:

答案 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代码中合并两个结果列表:( 或映射层次结构:)