Java 在Spring Hibernate中处理1000多条记录更新

Java 在Spring Hibernate中处理1000多条记录更新,java,sql,oracle,hibernate,jpa,Java,Sql,Oracle,Hibernate,Jpa,我有一个场景,其中我需要更新超过1000条记录的日期字段 我正在使用本机查询,但随后出现错误ora-01795列表中表达式的最大数量为1000 经过检查,我找到了一些解决方案,如打破中提到的in条款 但我正在寻找这个解决方案,不是一个非常干净的解决方案 在Spring中有没有其他更干净的方法?请建议 我当前的查询如下: @Modifying @Query(value = "UPDATE MY_TABLE SET FLAGGED_DATE = :date WHERE ID IN (:id

我有一个场景,其中我需要更新超过1000条记录的日期字段

我正在使用本机查询,但随后出现错误
ora-01795列表中表达式的最大数量为1000

经过检查,我找到了一些解决方案,如打破中提到的in条款

但我正在寻找这个解决方案,不是一个非常干净的解决方案

在Spring中有没有其他更干净的方法?请建议

我当前的查询如下:

@Modifying
@Query(value = "UPDATE MY_TABLE SET FLAGGED_DATE = :date WHERE ID IN (:ids)", nativeQuery = true)
void updateFlaggedDate(List<Long> ids, Date date);
修改 @查询(value=“UPDATE MY_TABLE SET FLAGGED_DATE=:DATE WHERE ID IN(:ids)”,nativeQuery=true) void updateFlaggedDate(列表ID、日期);
我传入的ID列表是从第三方API收集的。

如果允许您创建新表,请按如下操作:

create table id_list (id number);
将这一长串
ID
s存储到该表中(如何?我不懂Java,但我希望您知道如何做)

然后将其用作
UPDATE
语句中的子查询

update my_table set
  flagged_date = :date
where id in (select id from id_list)

现在,您不受值数量的限制,它可能非常庞大。

如果您不反对使用PL/SQL,您可以运行类似于下面示例的代码。这甚至可能比您使用的原始更新执行得更好,因为每次运行update语句时,您最初构建update语句的方式都是不同的。每次运行查询时,Oracle都需要制定一个执行计划,这可能会带来高昂的成本。修改代码以便每次运行相同的更新将有助于oracle每次使用相同的执行计划

DECLARE
    TYPE ids_t IS TABLE OF NUMBER;

    l_ids   ids_t := ids_t ();
BEGIN
    --build up your collection here
    l_ids.EXTEND (3);   --This will be the total number of IDs that you are adding to the collection
    l_ids (1) := 353;
    l_ids (2) := 234;
    l_ids (3) := 123;

    FORALL i IN 1 .. l_ids.COUNT
        UPDATE MY_TABLE
           SET FLAGGED_DATE = :date
         WHERE ID = l_ids (i);
END;
/

你认为一个干净的解决方案是什么样的?您应该能够构建SQL语句
,其中id=:id
,然后使用来自Java的不同绑定变量值运行同一SQL语句的批处理。不过,这并没有让我觉得比另一个答案中的选项更清晰。有几个选项可以解决这个问题:利用GTT、PTT、PLSQL、JSON甚至MAGIC!查看此链接: