【问题标题】:How Hibernate sorts collection with @OrderColumn annotation?Hibernate 如何使用 @OrderColumn 注释对集合进行排序?
【发布时间】:2016-06-14 09:20:41
【问题描述】:

我可以从生成的 SQL 中看到,查询具有这样映射集合的实体时:

@ElementCollection(targetClass = Long.class, fetch = FetchType.EAGER)
@CollectionTable(name = "LIST_GAMES", 
                 joinColumns = @JoinColumn(name = "LIST_ID", referencedColumnName = "ID"))
@Column(name = "GAME_ID")
@OrderColumn(name = "GAME_ORDER")
private List<Long> gameIds;

Hibernate 不会向其添加任何“order by”语句。那么这是否意味着该集合在加载后在内存中排序?或者这是否意味着我需要像 (LIST_ID, GAME_ORDER) 这样的数据库级别的复杂索引来处理数据库中的 order by?

UP:我的问题实际上是如何 hibernate 对这个集合进行排序?它是由内存中的休眠处理还是已从数据库中排序检索?我需要为 GAME_ORDER 列创建数据库索引吗?

【问题讨论】:

    标签: java database hibernate jpa


    【解决方案1】:

    OrderBy 在生成的 SQL 中添加 order by 子句,以按目标实体表的列对检索到的集合的成员进行排序:

    @OrderBy("GAME_ORDER ASC")
    public List<Long> gameIds;
    will generate a SQL query like
    

    选择 ... 按 game.game_order ASC 排序

    @OrderColumn 定义表中附加列的名称,包含列表中实体的索引。 如果更改列表中元素的顺序,Hibernate 将更改此列的值。如果您的 gameId 在此列中有 0、3 和 5 作为值,则列表将是

    [gameIds0, null, null, gameIds3, null, gameIds5]
    

    see here

    【讨论】:

      【解决方案2】:

      根据Oracle Doc@OrderColumn 是:

      指定一个列,用于维护一个列的持久顺序 列表。持久性提供者负责维护 在检索和数据库中订购。持久性提供者是 负责在刷新到数据库时更新排序到 反映影响列表的任何插入、删除或重新排序。

      所以很可能是在从数据库中检索数据并在内存中完成之后对集合进行排序。

      【讨论】:

      • @NeilStockton 如果持久化提供者无权添加SURROGATE COLUMN,您能否解释一下排序是如何进行的?
      • 嗨@NeilStockton,您能否参考任何官方的JPA 文档,其中写道@OrderColumn 依赖于SURROGATE COLUM?我的意思是SunOracle doc。
      • @NeilStockton apache 文档说The INDEX function returns an integer value corresponding to the position of its argument in an ordered list. The INDEX function can only be applied to identification variables denoting types for which an order column has been specified. 这是INDEX 与数据库INDEX 相关吗?
      • 我搜索了整个JPA 2.1 Specification,但在哪里找不到提到SURROGATE COLUMN
      • 很抱歉,我使用 @OrderColumn 和 Hibernate 作为持久性提供程序,但没有发现在数据库中的任何位置创建任何此类列。任何人都可以看到这一点。你为什么说like the JPA spec says?它(JPA 规范)在哪里对@OrderColumn 说这样的话?如果您非常确定为什么不提供链接来证明您的观点(仅 oraclesun 链接)?
      猜你喜欢
      • 2011-02-26
      • 1970-01-01
      • 1970-01-01
      • 2011-04-04
      • 1970-01-01
      • 2012-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多