这有效:
<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订购时,似乎没有必要。
答案 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
。