Подтвердить что ты не робот

Сопоставление списка в спящем режиме путем упорядочивания вместо индекса

Это работает:

<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, а затем отсортировать его самостоятельно в коде? Кажется ненужным, когда мы уже заказываем его БД.

4b9b3361

Ответ 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.