Tou*_*uko 6 sql orm persistence list
我得到了一个使用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)
Run Code Online (Sandbox Code Playgroud)
这是由数据库引擎完成的,但不受支持.
现在,我知道在考虑对象及其版本控制,脏检查等时,这种批量更新不太适合.我仍然会问是否有人有一些好主意或是否有一些持久性框架/ ORM /你的名字 - 这会提供一些帮助.当然我可以使用自定义SQL/HQL/...来做事情但是想知道是否已经有一些解决方案(我认为其他人之前可能已经做过类似的事情,甚至把它放在开源之下).还欢迎其他与此问题相关的好主意=)
我的建议是做两件事:
大的增量并不能消除重新订购大的问题,但是需要进行大的重新排序,并且批量工作是根据需要每天/每周/每月重新排序一次.
一次更换一大堆物品只是麻烦而且要求麻烦.
如果您确实想以连续的连续顺序结束,则可以这样做:
首先,乘以sortorder1000
UPDATE testtable SET sortorder = sortorder * 1000
Run Code Online (Sandbox Code Playgroud)
现在插入并插入合适的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
Run Code Online (Sandbox Code Playgroud)
之所以选择ID,是因为不能innerID为已更新的表加上别名,否则ID列将以歧义结束。
sortorder当按排序时,这将用行号更新sortorder。