我在加入桌子时遇到问题。其实我真的迷失了怎么做。我有这个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。
答案 0 :(得分:0)
您需要使用带反向的连接标记
<join table ="Technologies" inverse ="true" optional = "false">
<key column = "techno_id"/>
<many-to-one name="parent" class="Technology" />
</join>
答案 1 :(得分:0)
有两种方法可以做到。
按标准:
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).
Lazy:
hibernate中有一个功能允许我们在不使用条件的情况下获取某些连接。
<many-to-one name="parent" class="Technology" lazy="false"/>
答案 2 :(得分:0)
我相信这个问题并不是特定的Hibernate。即使您正在编写SQL,也没有简单的方法来获取具有所有后代的节点,而无需在设计中进行特殊处理。
最简单的方法是让每个技术都包含子技术列表(双向关系)。然后递归地遍历科技的孩子们。
如果您需要从持久性存储中快速检索,则必须在设计中满足这一要求。一种方法是我之前为类似问题写的答案中描述的。 https://stackoverflow.com/a/7524077/395202 这种方法不是Hibernate友好的(它仍然有效,只需要额外注意)