当前位置:  开发笔记 > 数据库 > 正文

ORM或有效处理带有订单列的SQL表的东西

如何解决《ORM或有效处理带有订单列的SQL表的东西》经验,为你挑选了2个好方法。

我得到了一个使用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/...来做事情但是想知道是否已经有一些解决方案(我认为其他人之前可能已经做过类似的事情,甚至把它放在开源之下).还欢迎其他与此问题相关的好主意=)



1> cletus..:

我的建议是做两件事:

    在您的商品之间选择非常大的增量,比如一百万.通过这种方式,您可以通过将项目更改为6,500,000来将项目在8,000,000之前移动到7,000,000之前; 和

    每隔一次又一次将项目重新排序为批处理作业.

大的增量并不能消除重新订购大的问题,但是需要进行大的重新排序,并且批量工作是根据需要每天/每周/每月重新排序一次.

一次更换一大堆物品只是麻烦而且要求麻烦.



2> John..:

如果您确实想以连续的连续顺序结束,则可以这样做:

首先,乘以sortorder1000

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

推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有