mapeo - mapear en hibernate
Asignación de una lista en hibernación ordenando en lugar de un campo de índice (2)
En realidad, esto se puede hacer con mapeos <bag>
, <set>
o <map>
. <bag>
usa semántica java.util.List
pero no mantiene índices de elemento. Al especificar su order-by
atributo, sus elementos se ordenarán como parte de SELECT:
<bag name="trips" cascade="all" order-by="scheduledDate">
<key column="trainId"/>
<one-to-many class="Trip"/>
</bag>
Tenga en cuenta que el atributo order-by
debe especificar el nombre (s) de columna , no el nombre de propiedad. Lo anterior se puede mapear a java.util.List
, puede hacer lo mismo con java.util.Set
utilizando la asignación <set>
. Sin necesidad de comparadores :-)
Los detalles estan aqui
Esto funciona:
<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>
Pero mis viajes están naturalmente ordenados por su scheduledDate
. Me gustaría reemplazar el Set
con una List
. Cambiar la colección a:
<list name="trips" cascade="all" order-by="scheduledDate">
<key column="trainId"/>
<one-to-many class="Trip"/>
</list>
no funciona, ya que ahora requiere un <index/>
. No deseo agregar un índice a mi tabla, porque el orden viene dado por la fecha .
De cualquier manera esto se puede hacer? ¿O debería simplemente obtener el Set
de Hibernate, y luego ordenarlo yo mismo en código? Parece innecesario cuando ya lo tenemos ordenado por el DB.
Me di cuenta de que el uso de una List
no es la forma correcta de almacenar una colección de artículos ordenados naturalmente.
La solución es usar un SortedSet
(como un TreeSet
) con un Comparator
.