Отображение списка в спящем режиме по порядку вместо поля индекса - PullRequest
17 голосов
/ 15 сентября 2009

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

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

Ответы [ 2 ]

32 голосов
/ 15 сентября 2009

На самом деле, это может быть сделано с <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 должен указывать столбец имя (а), а не имя свойства. Выше можно сопоставить с java.util.List, вы можете сделать то же самое с java.util.Set с помощью сопоставления <set>. Нет необходимости в компараторах: -)

Подробности здесь

0 голосов
/ 15 сентября 2009

Я понял, что использование List - неправильный способ хранения коллекции естественно упорядоченных предметов.

Решение состоит в том, чтобы использовать SortedSet (например, TreeSet) с Comparator.

...