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