繁体   English   中英

Hibernate:如何将表与自身连接?

[英]Hibernate: How do I join a table with itself?

我在加入桌子时遇到问题。 其实我真的很迷失如何做。 我有这个休眠表映射。

<class name="Technology" table="TECHNOLOGIES">
    <id name="technoId">
        <column name="techno_id" />
        <generator class="identity" />
    </id>        
    <property name="description" type="java.lang.String">
        <column name="description" />
    </property>
    <many-to-one name="parent" class="Technology" />
</class>

父列与同一张表相关。 该表的一个示例,以便您可以理解我。

techno_id | 说明| 父母

1 ------------“ Java” ----------空

2 ------------“休眠” ------ 1

3 ------------“ HQL” ------------ 2

4 ------------“。NET” ----------为空

5 ------------“ NHibernate” ---- 4

那基本上是表的一个例子,它没有真实的数据,只是一个例子。 我想做的是,在一种接收techno_id的方法中,使用Criteria或HQL运行该方法,并且也为我带来了带有子代ID的结果列表。 例如,如果我将“ 1” techno_id发送给该方法,它将为我带来一个ID为“ 1、2、3”的列表。 我希望我尽可能清楚,您可以帮助我。 谢谢,对不起我的英语jaja。

您需要使用带有反向连接标记

<join table ="Technologies" inverse ="true" optional = "false">
  <key column = "techno_id"/>
  <many-to-one name="parent" class="Technology" />
</join>

有两种方法。

  1. 按条件:

     1. For specific level fetching : eg 3 level fetching(As per your example) public Technology getAllChildrenTechnology(long parentID){ Crtieria criteria = session.createCriteria(Technology.class); criteria.add(Restriction.eq("id",parentID)); criteria.setFetchMode("parent",FetchMode.JOIN); criteria.setFetchMode("parent.parent",FetchMode.JOIN); criteria.setResultTransformer(criteria.DISTINCT_ROOT_PROPERTY); Technology techno = (Technology)criteria.uniqueResult(); return techno; } 2. For N level Fetching : You need to create n level for loop.(Recursive loop using above). 
  2. 通过懒惰:

    休眠中的一项功能使我们无需使用条件即可获取某些联接。

     <many-to-one name="parent" class="Technology" lazy="false"/> 

我相信这个问题并不是特定于Hibernate的。 即使您正在编写SQL,也没有简单的方法来获取节点及其所有后代,而无需在设计中进行特殊处理。

最简单的方法是让每个技术都包含子技术列表(双向关系)。 然后递归遍历Technology的子级。

如果需要从持久性存储中快速检索,则必须在设计中满足这一要求。 一种方式是我之前针对类似问题写的答案中所描述的。 https://stackoverflow.com/a/7524077/395202这种方法无论如何都不是Hibernate友好的(它仍然有效,只需要格外注意)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM