Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate:如何将表与其自身连接起来?_Java_Hibernate_Criteria - Fatal编程技术网

Java Hibernate:如何将表与其自身连接起来?

Java Hibernate:如何将表与其自身连接起来?,java,hibernate,criteria,Java,Hibernate,Criteria,我在加入一张桌子时遇到问题。实际上我真的不知道怎么做。我有这个Hibernate表映射 <class name="Technology" table="TECHNOLOGIES"> <id name="technoId"> <column name="techno_id" /> <generator class="identity" /> </id> <pro

我在加入一张桌子时遇到问题。实际上我真的不知道怎么做。我有这个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>
列父级与同一个表相关。一个表格的例子,让你能理解我

技术标识|描述|父项

1------Java------空

2----冬眠--1

3------HQL------2

4-----.NET-----空

5---NHibernate--4

这基本上是一个表的例子,它没有真实的数据,只是一个例子。 我想做的是,在一个接收技术id的方法中,使用条件或HQL运行,并为我带来一个带有子id的结果列表。 例如,如果我向方法发送1 techno_id,它应该会给我一个id为1、2、3的列表。 我希望我尽可能清楚,你能帮助我。
谢谢,很抱歉我的英语JAJAJA。

您需要使用反向连接标记

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

您需要将连接标记与反转一起使用

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

有两种方法

根据标准:

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

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

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

有两种方法

根据标准:

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

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

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

我相信这个问题并不是专门针对Hibernate的。即使您正在编写SQL,如果在设计中不进行特殊处理,也无法轻松地获取节点及其所有子代

最简单的方法是让每项技术都包含子技术列表。然后递归遍历技术的子代

如果需要从持久性存储中快速检索,则必须在设计中满足这一要求。一种方法是我之前为一个类似问题写的答案中描述的。
这个方法对Hibernate并不友好,但它仍然有效,只需要额外注意

我相信这个问题并不是针对Hibernate的。即使您正在编写SQL,如果在设计中不进行特殊处理,也无法轻松地获取节点及其所有子代

最简单的方法是让每项技术都包含子技术列表。然后递归遍历技术的子代

如果需要从持久性存储中快速检索,则必须在设计中满足这一要求。一种方法是我之前为一个类似问题写的答案中描述的。
这个方法对Hibernate不是很友好,但它仍然有效,只需要额外注意

谢谢,但是我怎么做呢?我必须创建一个方法来接收一个techno_id,并查找所有属于他的孩子的techno_id,以及他们的孩子。或者我如何执行查询或条件的限制?好吧,您有pojo技术,因为您定义了一个技术父对象。然后是简单的hql例如:from tech where tech.parent=:techno where techno可以设置为另一个技术对象但是当孩子也有孩子时会发生什么?在我的例子中,如果我给这个方法加1,它必须给我ID1,2,3 being,3是2的儿子,2是1的儿子。我不知道,我说得很清楚。谢谢!谢谢,但我怎么做的方法?我必须创建一个方法来接收一个techno_id,并查找所有属于他的孩子的techno_id,以及他们的孩子。或者我如何执行查询或条件的限制?好吧,您有pojo技术,因为您定义了一个技术父对象。然后是简单的hql例如:from tech where tech.parent=:techno where techno可以设置为另一个技术对象但是当孩子也有孩子时会发生什么?在我的例子中,如果我给这个方法加1,它必须给我ID1,2,3 being,3是2的儿子,2是1的儿子。我不知道,我说得很清楚。谢谢!但问题是,这种方法只给我带来了一种技术,我需要的是在不知道有多少个级别的子级的情况下,我将一种方法发送给它一个技术id,然后该方法返回一组属于该技术的子级的技术,同时也给我所有子级的技术,等等。在这种情况下,正如我所建议的,你需要使用N级Fecthing。但问题是,该方法只为我带来了一种技术,我需要的是不知道我将有多少个级别的子级,我将一个方法发送给它一个Techno_id,该方法返回一组属于该技术的子级的技术,同时也给我带上所有的孩子,等等。在这种情况下,你需要使用N级Fecthing,正如我已经建议的那样。