Red Hat Training

A Red Hat training course is available for Red Hat JBoss Web Server

7.3. 高度なコレクションマッピング

7.3.1. ソートされたコレクション

Hibernate は java.util.SortedMapjava.util.SortedSet を実装したコレクションをサポートしています。開発者はマッピング定義ファイルにコンパレータを指定しなければなりません:
<set name="aliases" 
            table="person_aliases" 
            sort="natural">
    <key column="person"/>
    <element column="name" type="string"/>
</set>

<map name="holidays" sort="my.custom.HolidayComparator">
    <key column="year_id"/>
    <map-key column="hol_name" type="string"/>
    <element column="hol_date" type="date"/>
</map>
sort 属性に設定できる値は unsortednatural および、 java.util.Comparator を実装したクラスの名前です。
ソートされたコレクションは実質的には java.util.TreeSetjava.util.TreeMap のように振舞います。
データベース自身にコレクションの要素を並べさせたい場合、setbagmap マッピングの order-by 属性を使います。この解決法は JDK1.4 、もしくはそれ以上のバージョンで利用可能で、LinkedHashSet または LinkedHashMapを使って実装されています。これはメモリ上ではなく、SQL クエリ内で整列の実行されます。
<set name="aliases" table="person_aliases" order-by="lower(name) asc">
    <key column="person"/>
    <element column="name" type="string"/>
</set>

<map name="holidays" order-by="hol_date, hol_name">
    <key column="year_id"/>
    <map-key column="hol_name" type="string"/>
    <element column="hol_date type="date"/>
</map>

注記

order-by 属性の値は、HQL 命令ではなくSQL 命令となっています。
関連は、コレクションの filter() を使うことで、実行時に任意の criteria によってソートすることも可能です:
sortedUsers = s.createFilter( group.getUsers(), "order by this.name" ).list();