通过排序而不是索引字段来映射hibernate中的列表

时间:2009-09-15 08:48:20

标签: hibernate list collections mapping

这有效:

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

但是我的旅行都是由scheduledDate自然命令的。我想将Set替换为List。将集合更改为:

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

不起作用,因为它现在需要<index/>。我不想在我的表中添加索引,因为的排序由日期给出。

任何方式都可以做到这一点?或者我应该从Hibernate获取Set,然后在代码中自己排序?当我们已经由DB订购时,似乎没有必要。

2 个答案:

答案 0 :(得分:32)

实际上,可以使用<bag><set><map>映射完成此操作。 <bag>使用java.util.List语义,但不维护元素索引。通过指定它的order-by属性,其元素将作为SELECT的一部分进行排序:

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

请注意,order-by属性需要指定名称,而不是属性名称。以上内容可以映射到java.util.List,您可以使用java.util.Set映射对<set>执行相同操作。不需要比较器: - )

详情为here

答案 1 :(得分:0)

我意识到使用List不是存储自然订购商品集合的正确方法。

解决方案是使用SortedSet(例如TreeSet)和Comparator