Hibernate如何使用@OrderColumn注解对集合进行排序?

问题描述:

,我可以从生成的SQL看到在查询与收藏单位这样映射:Hibernate如何使用@OrderColumn注解对集合进行排序?

@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不“按订单”的语句,将其添加任何。那么这是否意味着集合在加载后在内存中排序?或者这是否意味着我需要一个像数据库级别(LIST_ID,GAME_ORDER)的复杂索引来处理db中的顺序?

UP:我的问题实际上是如何 hibernate排序这个集合?它是通过hibernate在内存中处理还是从数据库检索到已经排序?我需要为GAME_ORDER列创建数据库索引吗?

按照Oracle Doc @OrderColumn是:

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

因此,在从数据库中检索数据并在内存中完成数据集之后,可能会对该集合进行排序。

+0

@NeilStockton如果持久性提供没有权限添加'SURROGATE COLUMN',能你请解释一下排序是如何发生的? –

+0

嗨@NeilStockton,你可以请参考任何官方的JPA文件写道,@ OrderColumn依赖于'SURROGATE COLUM'吗?我的意思是“Sun”或“Oracle”文档。 –

+0

@NeilStockton apache doc说'INDEX函数返回一个整数值,它对应于它的参数在一个有序列表中的位置。 INDEX函数只能应用于表示已为其指定了顺序列的类型的标识变量。这是与数据库INDEX相关的INDEX吗? –

排序依据由子句增加了一个为了将生成的SQL由目标实体的表的列检索到的集合的成员订购:由game.game_order ASC

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

选择...顺序

@OrderColumn定义表中附加列的名称,其中包含列表中实体的索引。 如果更改列表中元素的排序,Hibernate将更改此列的值。如果你的游戏ID有0,3和5的值在此列,该名单将

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

see here