6.3. Advanced collection mappings
6.3.1. Sorted collections
Hibernate supports collections implementing
java.util.SortedMap
and java.util.SortedSet
. You must specify a comparator in the mapping file:
<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>
Allowed values of the
sort
attribute are unsorted
, natural
and the name of a class implementing java.util.Comparator
.
Sorted collections actually behave like
java.util.TreeSet
or java.util.TreeMap
.
If you want the database itself to order the collection elements, use the
order-by
attribute of set
, bag
or map
mappings. This solution is only available under JDK 1.4 or higher and is implemented using LinkedHashSet
or LinkedHashMap
. This performs the ordering in the SQL query and not in the memory.
<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>
Note
The value of the
order-by
attribute is an SQL ordering, not an HQL ordering.
Associations can even be sorted by arbitrary criteria at runtime using a collection
filter()
:
sortedUsers = s.createFilter( group.getUsers(), "order by this.name" ).list();