Mapper une liste en veille prolongée en ordonnant à la place d'un champ-index
-
07-07-2019 - |
Question
Ceci fonctionne:
<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>
Mais mes voyages sont tous naturellement ordonnés par leur scheduledDate
. Je voudrais remplacer le Set
par un List
. Modification de la collection en:
<list name="trips" cascade="all" order-by="scheduledDate">
<key column="trainId"/>
<one-to-many class="Trip"/>
</list>
ne fonctionne pas, car il nécessite maintenant un <index/>
. Je ne souhaite pas ajouter d'index à ma table car l'ordre est donné par la date .
Est-ce que cela peut être fait? Ou devrais-je simplement obtenir le <=> auprès d'Hibernate, puis le trier moi-même dans le code? Cela semble inutile alors que nous l'avons déjà commandé par la DB.
La solution
En fait, cela peut être fait avec des mappages <bag>
, <set>
ou <map>
. java.util.List
utilise order-by
la sémantique mais ne conserve pas les index d'élément. En spécifiant son java.util.Set
attribut, ses éléments seront classés dans le cadre de SELECT:
<bag name="trips" cascade="all" order-by="scheduledDate">
<key column="trainId"/>
<one-to-many class="Trip"/>
</bag>
Notez que <=> l'attribut doit spécifier un nom de colonne , pas un nom de propriété. Ce qui précède peut être associé à <=>, vous pouvez faire de même avec <=> en utilisant <=> le mappage. Pas besoin de comparateurs: -)
Les détails sont ici
Autres conseils
Je me suis rendu compte que l'utilisation d'un List
n'est pas la bonne façon de stocker une collection d'éléments naturellement commandés.
La solution consiste à utiliser un SortedSet
(comme un TreeSet
) avec un Comparator
.