Hibernate Set/Map/Bagコレクションのorder-by設定について

2010/08/23 17:52Update
TAGS: hibernate | Set | Map | Bag | コレクション | 並び順 | oderby

並び順(ORDER BY)をHibernateで実装する方法としてはSQLやHQLを使う方法とCriteriaクラスを使う方法などがありますが、マッピングされた親子関係のテーブル同士の場合、Map、Set、Bagなどコレクションデータにorder byをかけたい場合、もっと簡単な方法があります。

例えば、
ある親(PARENT)に複数の子(CHILDREN)がいるとします、これらの子を「名前順」でORDER BYをかけたい場合、

以下のようなテーブル定義があるとします。
◇親テーブル
PARENT(ID、NAME)

◇子テーブル
CHILDREN(ID、NAME、PARENT_ID)


Parent.hbm.xml定義例
<hibernate-mapping>
<class 
    name="com.test.entity.Parent" 
    table="PARENT"
    lazy="false"
>

    <id
        name="id"
        type="java.lang.String"
        column="ID"
        length="32"
    >
        <generator class="uuid.hex" />
    </id>
    
    
    <set name="childrenSet" cascade="all-delete-orphan" lazy="true" 
            inverse="true" outer-join="auto" order-by="NAME ASC">
        <key column="PARENT_ID" not-null="true" />
        <one-to-many class="com.test.entity.ChildrenTable"/>
    </set>

</class>
</hibernate-mapping>


<set />マッピングのorder-by属性に「NAME」を指定することで、自動的にCHILDRENのNAME順にORDER BYしてくれます。

ちなみに、
order-by="NAME ASC"
  というのは、ORDER BY NAME ASCというSQLが実行されます。
※order-byに子テーブルのフィールド名及びASC、DESCを指定できます。

■order-by属性を指定可能なマッピング定義
また、次のようなマッピングにorder-byを指定可能です。

<map />
<set />
<bag />
<idbag />
<many-to-many />

参考資料


Hibernate Criteriaクエリ - Criteria.addOrderメソッドで並び順の設定
Hibernate のSetコレクション・マッピング
Hibernate のMapコレクション・マッピング

有关作者
Syboos.jp編集長システム設計や開発、保守運営などを行ってます。オープンソース技術に興味があります。

Sponsored Link


Comments