2011-09-06 54 views
3

我有2个实体:EntityA和EntityB。Hibernate/JPA:是否可以在单个查询中检索异构实体?

它们是不相关的,我不能将它们放在继承树中,以解决这个问题范围以外的一些限制。

但我需要进入相同的JPQL或HQL查询混合列表包含两个实体的所有实例。这可能与JPA甚至Hibernate直接?

我需要somethign这样的:

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

任何提示?

+1

简单的方法是将两个查询都连接起来,并将这两个列表连接在一个'List '中。 – toto2

+0

谢谢,但正如我评论,我被迫在1查询中都做,因为我正在使用分页,并且我不能分页独立querys。 – edutesoy

+0

@edutesoy:如果您使用HQL进行分页,将无法正常工作:请参阅[Hibernate参考](http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html# queryhql多态)。 –

回答

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>

问题解决。

+0

我对同一主题感兴趣。目前我使用两个查询(两个游标),它们通过criteria.scroll()返回Iterator,然后通过IteratorUtils.chainedIterator()连接两个迭代器。我想知道,Hibernate如何决定从查询结果创建哪个对象?由您提供的HQL生成的SQL查询是什么? –

+0

对于第一个问题,Hibernate返回CommonInterface的实例,其中一些将是EntityA和EntityB的其他实例的实例。对于你的第二个问题,我不知道所产生的SQL(在这一点上它并不担心)。 – edutesoy

+0

我快速查看了生成的SQL。它不是可选的,因为Hibernate会生成2个查询:'SELECT EntityA。* WHERE id IN(SELECT EntityA.id ... WHERE fieldA = 1)或id IN(SELECT EntityB.id ... WHERE fieldB ='a')'和'SELECT EntityB。* WHERE id IN(SELECT EntityB.id ... WHERE fieldB ='a')OR ID IN(SELECT EntityA.id ... WHERE fieldA = 1)'。显然,每个查询中的第二个子查询是错误的(至少在我的情况下)。 [Hibernate docu](http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html#queryhql-polymorphism)中没有这方面的信息:( –

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) 

这是肮脏的,你可能必须要仔细看语法。

问候。

+0

您能否提到由Hibernate从您提供的HQL生成的SQL查询? –

+0

感谢这个解决方案:在阅读相应的[Hibernate章节](http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html#queryhql-select)时我学到了很多东西, 。是否可以“滚动()”生成的查询?我想,不是... –

相关问题