Hibernate:如何与自己连接表?

时间:2012-04-26 16:16:48

标签: java hibernate criteria

我在加入桌子时遇到问题。其实我真的迷失了怎么做。我有这个Hibernate表映射。

<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。

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

有两种方法可以做到。

  1. 按标准:

    1. For specific level fetching : e.g 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. Lazy:

    hibernate中有一个功能允许我们在不使用条件的情况下获取某些连接。

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

答案 2 :(得分:0)

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

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

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