Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';在Hibernate中订购集合的最佳方式是什么?_Hibernate_List_Set_Bag - Fatal编程技术网

什么';在Hibernate中订购集合的最佳方式是什么?

什么';在Hibernate中订购集合的最佳方式是什么?,hibernate,list,set,bag,Hibernate,List,Set,Bag,我在Hibernate中有一个类的子值列表。我最初的实现是一个集合,但它返回的值基本上是“数据库顺序”(可能基于聚集索引,几乎是插入顺序) 我考虑切换到List,所以添加了一个,但很快就遇到了一个问题,返回的java列表中存在null。我的一些数据是由Hibernate编写的,但也有一些是由SQL脚本编写的 我想要的是一个sortOrder属性,它与列表中的位置无关,因此,如果存在重复项,即{1,3,3,10},它将被适当地映射到{0,1,2,3},其中第2项和第3项的顺序会回到数据库顺序。空值

我在Hibernate中有一个类的子值列表。我最初的实现是一个集合,但它返回的值基本上是“数据库顺序”(可能基于聚集索引,几乎是插入顺序)

我考虑切换到List,所以添加了一个,但很快就遇到了一个问题,返回的java列表中存在null。我的一些数据是由Hibernate编写的,但也有一些是由SQL脚本编写的

我想要的是一个sortOrder属性,它与列表中的位置无关,因此,如果存在重复项,即{1,3,3,10},它将被适当地映射到{0,1,2,3},其中第2项和第3项的顺序会回到数据库顺序。空值也可以,我不在乎它们是放在列表的前面还是后面(只要行为是一致的)

我查看了Bag,但我不确定如何将sortOrder属性引入定义中,我有点担心它允许重复。我仍然希望使用与设置时相同的约束(我相信父/子元组总是唯一的)


建议?我是否可以调整包,使其作为一个带有排序器的列表,而不是一个带有索引的列表?我还需要做什么来保护代码不被SQL直接输入的数据挂起

我在一个项目中也遇到了同样的问题。我能想出的最后一个解决方案是使用一个数据库触发器来保持这个位置数据的正确顺序。触发器获取列表中的记录并按正确的顺序排列,并更新位置


我认为在使用sql和hibernate更改数据时,您不会有任何其他选择

如果您使用的是hibernate注释,则可以使用
javax.persistence.OrderBy
按指定属性对“内存中”的元素排序,而不引入索引列,请参阅:


行可见和触发器更新之间是否存在争用条件?创建模式后,我猜您正在运行SQL来添加触发器?我使用的是SQL server,触发器是传输过程的一部分,因此不会出现计时问题。触发器是在sql中编写的,只是作为更新触发器添加到作为ISSUE的表中。这种方法非常干净,停止所有的零点进入你的位置COLUM。我一定会考虑它,但到目前为止,我是数据库不可知的,所以我更愿意找到一个100% Hibernate解决方案。你有没有玩过包?我玩过一点,但我觉得很难。我同意保持解决方案数据库的不可知性,但每个数据库都支持触发器,因此不会有太大的折衷。我没有使用注释,我只是有一个布局了模式的hbm文件。我看到了orderBy mechanics,但我的偏好是将大部分排序保留在数据库中,因为对于我的许多实现来说,这实际上是一个独立的大盒子,比应用程序盒子马力更大。此外,我确实希望显式地使用排序器列,因为我不是根据数据排序,而是根据用户对数据的顺序排序(这无疑有些不合理:——)