我得到了一个使用SQL表的Java应用程序,其中包含按订单列排序的有序实体列表.我想在列表中间添加/删除内容.现在,我想知道是否有一些持久性框架/ orm/you-name-它可以通过批量更新订单列来提供这种功能.
在基本情况下,Hibernate(也可能是其他人)也提供此功能.问题是对象是一次处理的,当列表足够大时会成为问题.替代解决方案是使用批处理SQL更新来执行此操作,例如:
UPDATE table SET order_col = order_col + 1 WHERE order_col > 47 INSERT TO table VALUES ('new_id', 'new_description, ..., 47)
这是由数据库引擎完成的,但不受支持.
现在,我知道在考虑对象及其版本控制,脏检查等时,这种批量更新不太适合.我仍然会问是否有人有一些好主意或是否有一些持久性框架/ ORM /你的名字 - 这会提供一些帮助.当然我可以使用自定义SQL/HQL/...来做事情但是想知道是否已经有一些解决方案(我认为其他人之前可能已经做过类似的事情,甚至把它放在开源之下).还欢迎其他与此问题相关的好主意=)
我的建议是做两件事:
在您的商品之间选择非常大的增量,比如一百万.通过这种方式,您可以通过将项目更改为6,500,000来将项目在8,000,000之前移动到7,000,000之前; 和
每隔一次又一次将项目重新排序为批处理作业.
大的增量并不能消除重新订购大的问题,但是需要进行大的重新排序,并且批量工作是根据需要每天/每周/每月重新排序一次.
一次更换一大堆物品只是麻烦而且要求麻烦.
如果您确实想以连续的连续顺序结束,则可以这样做:
首先,乘以sortorder
1000
UPDATE testtable SET sortorder = sortorder * 1000
现在插入并插入合适的sortorder
值,以将新条目放置在正确的位置。
现在执行表更新并使用ROW_NUMBER函数更新值
UPDATE testtable SET sortorder = subq.newsortorder FROM ( SELECT ID as innerID, ROW_NUMBER() OVER(ORDER BY sortorder ASC) as newsortorder FROM testtable ) subq WHERE subq.innerID = ID
之所以选择ID,是因为不能innerID
为已更新的表加上别名,否则ID列将以歧义结束。
sortorder
当按排序时,这将用行号更新sortorder
。