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>

列の親は同じテーブルに関連付けられています。あなたが私を理解できるようにテーブルの例。

テクノ ID | 説明 | 親

1------------「Java」----------null

2------------「休止状態」------1

3------------「HQL」------------2

4------------".NET"----------null

5------------「NHibernate」----4

これは基本的にテーブルの例であり、実際のデータはありません。単なる例です。私がやりたいことは、techno_id を受け取るメソッドで、Criteria または HQL を使用して実行することです。これにより、子 ID も含む結果のリストが表示されます。たとえば、「1」の techno_id をメソッドに送信すると、「1、2、3」の ID を持つリストが表示されます。私はできるだけ明確であり、あなたが私を助けてくれることを願っています. ありがとう、そして私の英語のジャジャをごめんなさい。

4

3 に答える 3

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 に答える
0

それには2つの方法があります。

  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 の子を再帰的にトラバースします。

永続ストレージからすばやく取得する必要がある場合は、設計で対応する必要があります。1つの方法は、同様の質問に対して以前に書いた回答で説明されているとおりです。https://stackoverflow.com/a/7524077/395202 とにかく、この方法はHibernateフレンドリーではありません(それでも機能しますが、特別な注意が必要です)

于 2012-04-27T08:28:21.857 に答える