6.3. 高度なコレクションマッピング
6.3.1. ソートされたコレクション リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Hibernate は
java.util.SortedMap と java.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 属性に設定できる値は unsorted と natural および、 java.util.Comparator を実装したクラスの名前です。
ソートされたコレクションは実質的には
java.util.TreeSet や java.util.TreeMap のように振舞います。
データベース自身にコレクションの要素を並べさせたい場合、
set や bag、map マッピングの 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();