6.3.1. 有序集合(Sorted collections)

Hibernate支持实现java.util.SortedMapjava.util.SortedSet的集合。 你必须在映射文件中指定一个比较器:

  1. <set name="aliases"
  2. table="person_aliases"
  3. sort="natural">
  4. <key column="person"/>
  5. <element column="name" type="string"/>
  6. </set>
  7. <map name="holidays" sort="my.custom.HolidayComparator">
  8. <key column="year_id"/>
  9. <map-key column="hol_name" type="string"/>
  10. <element column="hol_date" type="date"/>
  11. </map>

sort属性中允许的值包括unsorted,natural和某个实现了java.util.Comparator的类的名称。

分类集合的行为事实上象java.util.TreeSet或者java.util.TreeMap

如果你希望数据库自己对集合元素排序,可以利用set,bag或者map映射中的order-by属性。这个解决方案只能在jdk1.4或者更高的jdk版本中才可以实现(通过LinkedHashSet或者 LinkedHashMap实现)。 它是在SQL查询中完成排序,而不是在内存中。

  1. <set name="aliases" table="person_aliases" order-by="lower(name) asc">
  2. <key column="person"/>
  3. <element column="name" type="string"/>
  4. </set>
  5. <map name="holidays" order-by="hol_date, hol_name">
  6. <key column="year_id"/>
  7. <map-key column="hol_name" type="string"/>
  8. <element column="hol_date" type="date"/>
  9. </map>

注意: 这个order-by属性的值是一个SQL排序子句而不是HQL的!

关联还可以在运行时使用集合filter()根据任意的条件来排序。

  1. sortedUsers = s.createFilter( group.getUsers(), "order by this.name" ).list();