Hibernate一对多检索

时间:2012-03-17 05:26:24

标签: hibernate

我有两张父母和小孩的桌子。我将这两个表中的数据作为父级:

PARENT_ID   city
----------------
20           B 
22           C
24           D

子:

CHILD_ID    PARENT_CHILD_JOIN        phone
------------------------------------------
2             20                     1111
3             20                     2222 
4             22                     3333

我已将child.hbm.xml中的这两个表关联为:

<many-to-one name="myMtO" class="com.Parent" fetch="select">
        <column name="PARENT_CHILD_JOIN" not-null="true" />
</many-to-one>
在parent.hbm.xml中:

<set name="mySet" table="child" cascade="save-update"  inverse="true" lazy="true" fetch="select">
        <key>
            <column name="PARENT_CHILD_JOIN" not-null="true" />
        </key>
<one-to-many class="com.Child" />  
</set>

保存时我只保存parent , session.save(parent); 通过执行此操作,子表中的PARENT_CHILD_JOIN值将从父表的PARENT_ID列自动填充。

现在我想在这里获取数据:

select c.phone 
from child c, parent p 
where c.PARENT_CHILD_JOIN = p.PARENT_ID 

但是它说PARENT_CHILD_JOIN列不存在于child中。这是正确的。因为在保存时我没有明确地设置它。

有人能告诉我如何检索这些一对多的数据?

2 个答案:

答案 0 :(得分:2)

这是SQL的问题,而不是真正的休眠问题。有许多方法可以在SQL中修复它(例如减去语句)。 要在Hibernate中模拟相同的行为,可以使用IN / NOT IN语句。这是我发现的最简单的方法(考虑到你必须匹配“n”个子列值,而不仅仅是一个)。

更具体一点: 1.从子表中选择列值IN(...)。在FK列或您想要的其他列上设置投影(我将使用FK列,例如parrent的id)。 2.从子表中选择列值NOT IN(...)。在FK或您想要的其他列上设置投影(同样在这里:我将使用FK列,例如parrent的id)。 3.选择所有的parrents,其中ID IN查询结果来自第1点,而ID NOT IN查询结果来自第2点。

这样你也可以确定你不会得到parrent对象的副本。如果你想要分页,你也可以使用我描述的最后一个查询。

如果有帮助,请提供一些反馈。

希望有所帮助,尼古拉

答案 1 :(得分:0)

HQL使用实体及其属性。它不使用表名和列名。

select c.phone from Child c inner join c.myMtO

请注意,此连接(以及查询中的where子句)不起任何作用,因为所有Child都链接到父级(连接列不为null)。

Hibernate文档有一个whole chapter dedicated to HQL。阅读它。

旁注:myMtO真的是一个可怕的名字。