2011-09-08 50 views
4

我有4个实体的层次结构是这样的:限制Hibernate(和JPA)标准的表现力?

   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的标准和JPA标准API和我不能找到一种方式来表达这个查询作为标准

这是标准的API的限制?还是只是我错过了方式?任何提示?

回答

1

如果您在映射中为每个子类设置了区分值(例如,Child1为1,Child2为2,Child3为3),您可以在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 
+0

谢谢。我没有这样的鉴别者。但无论如何,子查询可能会引用具体的孩子的其他领域,我只是简化了问题...... **我更新了问题**来评论这一点。 – edutesoy

-1

好了,你说,你有没有映射你的类层次结构,您的评论,你有吗?

因此,无法使用Criteria构建对Child1和Child2的查询。事实上,我不认为你的HQL示例工作,因为父没有映射。

一个丑陋的解决方案是查询时间,Child1的Criteria查询和Child2的另一个Criteria查询。然后在Java代码中合并两个结果列表:( 或映射层次结构:)

+1

当然,它工作,Hibernate检查类和发现接口。我认为父母应该像你一样被映射,当我看到实际上并不需要时,我也感到惊讶。对于2查询解决方案,我不想在内存中加载所有这些数据,并且仅仅因为_Criteria功能不够强大而进行3次查询。我更喜欢在HQL中做到这一点。我只是想确定它是Criteria的错,而不是我的:)。无论如何,即使我映射层次结构,它也不会像我在其他答案的评论中所说的那样工作(我更新了问题以反映这种情况)。谢谢!! – edutesoy