我有两张父母和小孩的桌子。我将这两个表中的数据作为父级:
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>
<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中。这是正确的。因为在保存时我没有明确地设置它。
有人能告诉我如何检索这些一对多的数据?
答案 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
真的是一个可怕的名字。