Как получить сортируемый набор в спящем режиме - PullRequest
1 голос
/ 30 сентября 2011

Мы обычно используем наборы для одного, многих и многих для многих коллекций в спящем режиме. До сих пор это работало нормально.

Но теперь нам нужно все больше и больше делать сортировку в памяти дочерних коллекций на уровне контроллера, потому что разные представления должны видеть дочерние коллекции в разных порядках. Мы не можем просто указать порядок в объявлении сущности, который работает для всех наших представлений.

Наша проблема в том, что вы не можете Collections.sort a Set, и мы боимся помещать наш Set в список, потому что это может нарушить нашу привязку (особенно в отношении родительских и дочерних элементов).

Таким образом, мы думаем об изменении всего нашего Set to List в сущностях (без столбца индекса), но это кажется экстремальным, и я читал о проблемах с двунаправленными отношениями списков один ко многим и многие ко многим. *

Есть предложения?

Ответы [ 4 ]

1 голос
/ 30 сентября 2011

Вы можете позволить вашим объектам set реализовывать интерфейс Comparable <> .

Таким образом, используя функцию compareTo (которую вы должны реализовать), вы можете указать порядок для ваших наборов.

Hibernate, инициализируя набор, будет использовать порядокуказано в функции сравнения.

0 голосов
/ 30 сентября 2011

Я думаю, что отсортированный набор может вам помочь.Например:

@OneToMany()
@Sort(comparator = SomeComparator.class, type = SortType.COMPARATOR)
private SortedSet<Item> items= new TreeSet<Item>(SomeComparator.instance());

Реализуйте собственный компаратор и используйте его для сортированных наборов.

0 голосов
/ 30 сентября 2011

Вы можете определить Формула (также в критериях) или SortedSet и реализует comparator. В определении набора вы также можете (в 3.3) определить элемент order-by (SQL).

Пример:

Formula: Made in DBMS for a particular relation.
<many-to-one name="homeAddress" class="Address" insert="false" update="false">
    <column name="person_id" not-null="true" length="10"/> 
    <formula>'ORDER BY LENGTH(homeAddress)'</formula>   
</many-to-one>

Formula in Criteria: Made in DBMS.
sortedUsers = s.createFilter( group.getUsers(), "order by this.name" ).list();

Sorted: Made in Java and application wide for a particular relation.
<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>

Order-by clause: Made in DBMS and application wide for a particular relation.
<set name="aliases" table="person_aliases" order-by="lower(name) asc">
    <key column="person"/>
    <element column="name" type="string"/>
</set>
0 голосов
/ 30 сентября 2011

В коллекциях Google есть ImmutableSortedSet , возможно, это может помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...