2

我在加入表格时遇到问题。实际上,我真的迷失了如何去做。我有这个 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>

列 parent 与同一个表相关。一个表格的例子,这样你就可以理解我了。

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。

4

3 回答 3

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. 通过懒惰:

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

    <many-to-one name="parent" class="Technology"  lazy="false"/>
    
于 2012-04-27T04:38:54.893 回答
0

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

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

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

于 2012-04-27T08:28:21.857 回答
0

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

<join table ="Technologies" inverse ="true" optional = "false">
  <key column = "techno_id"/>
  <many-to-one name="parent" class="Technology" />
</join>
于 2012-04-26T16:27:50.830 回答