Pergunta

Isso 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>

Mas minhas viagens são todos naturalmente ordenados pela scheduledDate. Gostaria de substituir o Set com um List. Alterando a coleção para:

        <list name="trips" cascade="all" order-by="scheduledDate">
            <key column="trainId"/>
            <one-to-many class="Trip"/>
        </list>

não funciona, uma vez que agora exige um <index/>. Eu não quero adicionar um índice à minha mesa, porque a ordem é dada pela data .

De qualquer forma isso pode ser feito? Ou devo apenas obter o Set do Hibernate, e, em seguida, classificá-lo eu mesmo no código? Parece desnecessário quando já tê-lo ordenado pelo DB.

Foi útil?

Solução

Na verdade, isso pode ser feito com <bag>, <set> ou <map> mapeamentos. <bag> usa semântica java.util.List mas não mantém índices de elementos. Especificando-atributo order-by, seus elementos serão ordenados como parte da SELECT:

<bag name="trips" cascade="all" order-by="scheduledDate">
    <key column="trainId"/>
    <one-to-many class="Trip"/>
</bag>

Note que as necessidades de atributos order-by para especificar coluna Nome (s), não o nome da propriedade. A descrição acima pode ser mapeado para java.util.List, você pode fazer o mesmo com java.util.Set usando mapeamento <set>. Não há necessidade de comparadores: -)

Os detalhes estão aqui

Outras dicas

Eu percebi que usando um List não é a maneira correta de armazenar uma coleção de itens naturalmente ordenadas.

A solução é a utilização de um SortedSet (como um TreeSet) com um Comparator.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top