我有2个实体:EntityA和EntityB。Hibernate/JPA:是否可以在单个查询中检索异构实体?
它们是不相关的,我不能将它们放在继承树中,以解决这个问题范围以外的一些限制。
但我需要进入相同的JPQL或HQL查询混合列表包含两个实体的所有实例。这可能与JPA甚至Hibernate直接?
我需要somethign这样的:
FROM EntityA WHERE fieldA=1
UNION
FROM EntityB WHERE fieldB="aa"
任何提示?
我有2个实体:EntityA和EntityB。Hibernate/JPA:是否可以在单个查询中检索异构实体?
它们是不相关的,我不能将它们放在继承树中,以解决这个问题范围以外的一些限制。
但我需要进入相同的JPQL或HQL查询混合列表包含两个实体的所有实例。这可能与JPA甚至Hibernate直接?
我需要somethign这样的:
FROM EntityA WHERE fieldA=1
UNION
FROM EntityB WHERE fieldB="aa"
任何提示?
嗯,我终于明白了。
它足以使实体实现一个通用接口(甚至不需要在Hibernate中声明此接口)。
然后,这样的查询可以做到:
FROM my.package.CommonInterface obj
WHERE obj IN (FROM EntityA WHERE fieldA=1) OR
obj IN (FROM EntityB WHERE fieldB='a')
这样,您检索List<CommonInterface>
。
问题解决。
我对同一主题感兴趣。目前我使用两个查询(两个游标),它们通过criteria.scroll()返回Iterator,然后通过IteratorUtils.chainedIterator()连接两个迭代器。我想知道,Hibernate如何决定从查询结果创建哪个对象?由您提供的HQL生成的SQL查询是什么? –
对于第一个问题,Hibernate返回CommonInterface的实例,其中一些将是EntityA和EntityB的其他实例的实例。对于你的第二个问题,我不知道所产生的SQL(在这一点上它并不担心)。 – edutesoy
我快速查看了生成的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)中没有这方面的信息:( –
最好的事情是执行两个查询。
但是如果你必须:
您可以创建一个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)
这是肮脏的,你可能必须要仔细看语法。
问候。
您能否提到由Hibernate从您提供的HQL生成的SQL查询? –
感谢这个解决方案:在阅读相应的[Hibernate章节](http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html#queryhql-select)时我学到了很多东西, 。是否可以“滚动()”生成的查询?我想,不是... –
简单的方法是将两个查询都连接起来,并将这两个列表连接在一个'List
谢谢,但正如我评论,我被迫在1查询中都做,因为我正在使用分页,并且我不能分页独立querys。 – edutesoy
@edutesoy:如果您使用HQL进行分页,将无法正常工作:请参阅[Hibernate参考](http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html# queryhql多态)。 –