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是:
指定用于维持 列表的顺序持续一列。持久性提供程序负责维护检索时和数据库中的 订单。持久化提供程序是 ,负责将刷新到数据库的排序更新为 ,反映影响列表的任何插入,删除或重新排序。
因此,在从数据库中检索数据并在内存中完成数据集之后,可能会对该集合进行排序。
答
排序依据由子句增加了一个为了将生成的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]
@NeilStockton如果持久性提供没有权限添加'SURROGATE COLUMN',能你请解释一下排序是如何发生的? –
嗨@NeilStockton,你可以请参考任何官方的JPA文件写道,@ OrderColumn依赖于'SURROGATE COLUM'吗?我的意思是“Sun”或“Oracle”文档。 –
@NeilStockton apache doc说'INDEX函数返回一个整数值,它对应于它的参数在一个有序列表中的位置。 INDEX函数只能应用于表示已为其指定了顺序列的类型的标识变量。这是与数据库INDEX相关的INDEX吗? –