Сопоставление списка в спящем режиме путем упорядочивания вместо индекса
Это работает:
<hibernate-mapping>
<class name="Train" table="Trains">
<id column="id" name="id" type="java.lang.String" length="4">
<generator class="assigned" />
</id>
<set name="trips" cascade="all">
<key column="trainId"/>
<one-to-many class="Trip"/>
</set>
</class>
</hibernate-mapping>
Но мои поездки, естественно, упорядочены по их scheduledDate
. Я хотел бы заменить Set
на List
. Изменение коллекции:
<list name="trips" cascade="all" order-by="scheduledDate">
<key column="trainId"/>
<one-to-many class="Trip"/>
</list>
не работает, так как теперь требуется <index/>
. Я не хочу добавлять индекс в свою таблицу, потому что упорядочение задается датой.
Как это можно сделать? Или я должен просто получить Set
из Hibernate, а затем отсортировать его самостоятельно в коде? Кажется ненужным, когда мы уже заказываем его БД.
Ответы
Ответ 1
Собственно, это можно сделать с помощью сопоставлений <bag>
, <set>
или <map>
. <bag>
использует семантику java.util.List
, но не поддерживает индексы элементов. Указав атрибут order-by
, его элементы будут упорядочены как часть SELECT:
<bag name="trips" cascade="all" order-by="scheduledDate">
<key column="trainId"/>
<one-to-many class="Trip"/>
</bag>
Обратите внимание, что атрибуту order-by
необходимо указать column имя (имена), а не имя свойства. Вышеуказанное может быть отображено на java.util.List
, вы можете сделать то же самое с java.util.Set
, используя <set>
mapping. Нет необходимости в компараторах: -)
Подробности здесь
Ответ 2
Я понял, что использование List
не является правильным способом хранения коллекции естественно упорядоченных элементов.
Решение состоит в использовании a SortedSet
(например, a TreeSet
) с Comparator
.