代码之家  ›  专栏  ›  技术社区  ›  Magnar

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

  •  16
  • Magnar  · 技术社区  · 15 年前

    这工作:

    <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/> .我不想在我的表中添加索引,因为 按日期订购 .

    有什么办法可以做到吗?或者我应该得到 集合 从休眠开始,然后自己在代码中排序?当我们已经由数据库订购了它时,这似乎是不必要的。

    2 回复  |  直到 11 年前
        1
  •  31
  •   Andy    11 年前

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

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

    注意 按顺序 需要指定属性 名称,而不是属性名称。以上可以映射到 Java.U.T.LIST 你也可以这样做 java.util.Set 通过使用 <SET & GT; 映射。无需比较器:—)

    细节是 here

        2
  •  0
  •   Magnar    15 年前

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

    解决方法是使用 SortedSet (像一个 TreeSet ) Comparator .