6

注文列で並べ替えられたエンティティの順序付きリストを含む SQL テーブルを使用する Java アプリケーションを取得しました。リストの途中にあるものを追加/削除したいと思います。さて、いくつかの永続化フレームワーク / orm / you-name-it が注文列のバッチ更新でこの種の機能を提供できるかどうか疑問に思っています。

基本的なケースでは、Hibernate (およびおそらく他のものも) がこの機能を提供します。問題は、オブジェクトが一度に 1 つずつ処理されることです。これは、リストが十分に大きい場合に問題になります。別の解決策は、たとえば次のように、バッチ SQL 更新を使用して行うことです。

UPDATE table SET order_col = order_col + 1 WHERE order_col > 47
INSERT TO table VALUES ('new_id', 'new_description, ..., 47)

これはデータベース エンジンによって非常に高速に実行されますが、サポートされていません。

さて、オブジェクトとそのバージョン管理、ダーティチェックなどを考えると、この種のバッチ更新はあまりうまくいかないことを理解しています. -それはいくつかの助けを提供します。もちろん、私はカスタム SQL/HQL/... でそれを行うことができますが、すでに何らかの解決策があるかどうか疑問に思っていました (他の誰かが以前にこのようなことを行い、それをオープンソースにすることさえできたと思います)。また、問題に関連する他の良いアイデアも大歓迎です =)

4

2 に答える 2

6

私のアドバイスは、次の 2 つのことを行うことです。

  1. 100 万など、アイテム間の非常に大きな増分を選択します。このようにして、アイテムを 6,500,000 に変更するだけで、8,000,000 のアイテムを 7,000,000 より前に移動できます。と
  2. ときどきアイテムをバッチ ジョブとして並べ替えます。

大きな増分は、大規模な再注文を行う問題を排除するものではありませんが、大規模な再注文を行う必要はほとんどなく、必要に応じて毎日/週/月に 1 回再注文するバッチ ジョブがあります。

大量のアイテムを一度に変更するのは面倒で、面倒です。

于 2009-01-30T12:43:48.543 に答える
5

本当に連続した順序で終わらせたい場合は、次のようにすることができます。

まず、これに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ます。

于 2009-01-30T14:10:51.393 に答える