Java Hibernate:如何将表与其自身连接起来?
我在加入一张桌子时遇到问题。实际上我真的不知道怎么做。我有这个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
<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,正如我已经建议的那样。