Hibernate / JPA:是否可以在单个查询中检索异构实体?

时间:2011-09-06 15:41:29

标签: java hibernate jpa orm persistence

我有2个实体:EntityA和EntityB。

它们是无关的,我不能将它们放在继承树中,以解决本问题范围之外的某些限制。

但是我需要在同一个JPQL或HQL查询中获得包含两个实体的所有实例的混合List。这可能是JPA甚至直接使用Hibernate吗?

我需要这样的事情:

FROM EntityA WHERE fieldA=1
UNION
FROM EntityB WHERE fieldB="aa"

任何提示?

2 个答案:

答案 0 :(得分:5)

好吧,我终于明白了。

应该让实体实现一个通用接口(甚至不需要在Hibernate上声明这个接口)。

然后,可以完成这样的查询:

FROM my.package.CommonInterface obj
WHERE obj IN (FROM EntityA WHERE fieldA=1) OR
      obj IN (FROM EntityB WHERE fieldB='a')

这样,您可以检索List<CommonInterface>

问题解决了。

答案 1 :(得分:2)

最好的事情是执行两个查询。

但如果你必须:

您可以创建POJO来检索它们:

class EntityAandEntityB {
    EntityA a;
    EntityB b;
    long idA;
    long idB;
    int fieldA;
    String fieldB;

    public EntityAandEntityB(long idA, long IdB, int fieldA, String fieldB) {
       this.a = new EntityA(idA, fieldA);
       this.b = new EntityB(idB, fieldB);
    }
}

然后你的查询将是:

select new package.EntityAandEntityB(a.idA, a.fieldA, b.idB, b.fieldB) from ( 
    (select idA, fieldA from EntityA) a
UNION
    (select idB, fieldB from EntityB) b)

这很脏,你可能必须仔细查看语法。

问候。