2009-09-15 8 views
16

Esto funciona:Asignación de una lista en hibernación, ordenando en lugar de un índice de campos

<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 son todos de forma natural pincha en scheduledDate. Me gustaría reemplazar el Set con un List. Cambio de 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.

¿Alguna forma de hacerlo? ¿O debería obtener el Set de Hibernate y luego ordenarlo por mí mismo en código? Parece innecesario cuando ya lo tenemos ordenado por el DB.

Respuesta

31

En realidad, esto se puede hacer con <bag>, <set> o <map> mappings. <bag> usa la semántica java.util.List pero no mantiene índices de elementos. Especificando que es order-by atributo, sus elementos se ordenan 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 order-by atributo debe especificar la columna nombre (s), no el nombre de la propiedad. Lo anterior se puede mapear a java.util.List, puede hacer lo mismo con java.util.Set mediante el mapeo <set>. No hay necesidad de comparadores :-)

detalles son here

+0

excelente, gracias! :-) – Magnar

+2

El enlace publicado ahora da un 404. Debe ser http://docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/collections.html#collections-sorted – Saheed

0

Me di cuenta de que usar un 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.

Cuestiones relacionadas