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

时间:2016-06-14 09:20:42

标签: java database hibernate jpa

正如我在生成的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)来处理db中的顺序?

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

2 个答案:

答案 0 :(得分:0)

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

@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

答案 1 :(得分:-1)

根据Oracle Doc @OrderColumn:

  

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

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