使用Hibernate查询“扩展表”

时间:2009-05-09 22:35:28

标签: java hibernate orm

我在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)。

谢谢!

2 个答案:

答案 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实体有时可以作为普通的测试延迟加载代理返回。