我在Hibernate中遇到了一个查询问题。我有一个表'test',包含现有数据。我有一个要求,我不能修改测试表的模式,所以我创建了另一个表'testExtension',其主键是Test的主键的外键。 testExtension中的数据是测试中数据的子集。即'testExtension'中的行数少于'test'中的行数。
我在配置文件中定义了这种关系,如下所示:
<class name="Test" table="test">
<id name="testId" column="test_id">
<generator class="sequence">
<param name="sequence">test_id_seq</param>
</generator>
</id>
<property name="name"/>
<joined-subclass name="TestExtension" table="testExtension">
<key column="test_id"/>
<property name="summary" />
<property name="homepage"/>
</joined-subclass>
通过这种设置,我可以在我的Java程序中创建一个TestExtension对象,用数据填充它,通过Hibernate“保存”它,然后提交事务。它正确地在Test和TestExtension中保存数据。
当我尝试从这些表中查询数据时,我的问题就出现了。现在,如果我使用TestExtension.class查询特定的test_id到QBE,如果在Test和TestExtension中都存在该id,它将只返回一行。如果我将Test.class用于QBE,它将返回该行但我无法访问存储在TestExtension中的任何数据。
我的问题是:如何查询这些表,以便结果基于Test和TestExtension的“左外连接”?任何解决方案都是值得赞赏的,无论是通过示例查询,HQL还是其他方式(尽管最好不是原始SQL)。
谢谢!
答案 0 :(得分:1)
HQL可能是最简单的方法。文档在这里:
http://docs.jboss.org/hibernate/stable/core/reference/en/html/queryhql-joins.html
您可能想要做的就是重新映射您的关系,以便Test和TestExtension使用一对一的关系而不是继承。然后,您可以使用一对一的左外连接来查询Test和TestExtension。
答案 1 :(得分:0)
如果您使用HQL为Test类编写查询,它应该执行您想要的操作。我假设QBE有效地将您的示例实体的类添加为查询参数之一。
所以......好像:
from Test t where t.property = :value
应该返回Test或TestExtension实体。请注意(至少我使用过的Hibernate版本)。在这种情况下,Hibernate应该立即返回实际的实体而不是代理 - 请注意TestExtension实体有时可以作为普通的测试延迟加载代理返回。