Hibernate 休眠一对多检索

Hibernate 休眠一对多检索,hibernate,Hibernate,我有两张父母和孩子的桌子。我将这两个表中的数据作为父表: PARENT_ID city ---------------- 20 B 22 C 24 D 儿童: CHILD_ID PARENT_CHILD_JOIN phone ------------------------------------------ 2 20 1111 3

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

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\u CHILD\u JOIN列在CHILD中不存在。是的。因为在保存时,我没有明确设置它


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

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

select c.phone from Child c inner join c.myMtO
请注意,此联接(以及查询中的where子句)没有任何用途,因为所有子级都链接到父级(联接列不为null)

Hibernate文档有一个。读一下


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

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

更具体地说: 1.从列值位于(…)中的子表中选择。在FK列或您想要的其他列上设置投影(我将使用FK列,例如,parrent的id)。 2.从列值不在(…)中的子表中选择。在FK或您想要的其他列上设置投影(此处相同:我将使用FK列,例如,parrent的id)。 3.选择所有参数,其中ID在点1的查询结果中,ID不在点2的查询结果中

这样,您还可以确保不会获得parrent对象的副本。如果需要分页,还可以使用我描述的最后一个查询

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


希望这能有所帮助,尼古拉

谢谢你。但是如果我想使用where条件,因为我想在我的查询中添加where条件select c.phone from Child c,parent p internal join c.myMtO where p.city='B',因为它仍然返回所有结果。然后为加入的实体指定一个别名:
选择c.phone from Child c internal join c.myMtO parent,其中parent.city='B'
。你看过文档了吗?再次感谢JB的帮助!!!从文档中,我浏览了where子句部分,并尝试了一些foo示例,但没有成功。但现在它返回了正确的结果。谢谢您好@JB Nizet。在上面的关系中,我试图更新子表的phone列。我想将所有电话值更新为满足父子连接条件的“000000”(其中child.parent\u child\u join=20)。我试过,比如,Parent p=(Parent)session.load(Parent.class,20);Child c=(Child)p.getMySet().iterator().next();c、 设置电话(“00000000”);session.save(p);但它会为子表中的某些记录创建重复行。我如何更新子记录。Session.save会这样做:它会创建一个新实体。您不必调用任何会话方法来修改实体。您可以加载、修改它,然后Hibernate自动保存所有修改。您有两个不同的帐户。请决定你要用哪一个。
select c.phone 
from child c, parent p 
where c.PARENT_CHILD_JOIN = p.PARENT_ID 
select c.phone from Child c inner join c.myMtO