当前位置: 首页 > 知识库问答 >
问题:

在Spring Hibernate中处理超过1000条记录更新

赫连华皓
2023-03-14

我有一个场景,我需要为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);

我传入列表的ID是从第三方API收集的。

共有2个答案

唐恺
2023-03-14

如果您不反对使用PL/SQL,您可以运行类似于下面示例的代码。这甚至可能比您使用的原始更新执行得更好,因为您构建UPDATE语句的原始方式每次运行时都是不同的语句。每次运行查询时,Oracle都需要提出一个执行计划,这可能会很昂贵。修改您的代码以使每次运行相同的UPDATE将有助于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;
/
纪鸿禧
2023-03-14

如果允许创建新表,请按

create table id_list (id number);

将这一长串ID存储到该表中(怎么做?我不懂Java,但我希望你知道怎么做)。

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

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

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

 类似资料:
  • 我正在开发spring-mvc应用程序。 我需要处理超过10万条数据记录。我不能让它依赖于数据库,所以我必须用java实现所有逻辑。 目前,我正在创建多个线程,并将1000条记录分配给每个要处理的线程。 我正在使用org。springframework。行程安排。同时发生的ThreadPoolTaskExecutor(线程池任务执行器)。 列表项 问题: 建议使用的线程数 我应该在线程之间平均分配

  • 在Spring Hibernate JTA项目中,我试图让异常处理工作。对于以下代码: 我试图捕捉底层hibernate/jdbc/db异常(例如,当依赖实体仍然存在时,删除将失败,并出现org . spring framework . ORM . hibernate 3 . hibernate JDBC exception)并执行一些操作。然而,catch代码永远不会到达。 但是如果我从我的方法

  • 我使用的是spring批处理,和通常使用的一样,我有读取器、处理器和写入器。 我有两个问题 1>Reader查询所有200条记录(表中记录总大小为200,我给出了pageSize=200),因此它得到所有200条记录,在处理器中,我们需要所有这些记录的列表,因为我们必须将每个记录与其他199条记录进行比较,以便将它们分组在不同的层中。因此我在想,如果我们能在处理步骤中得到那个列表,我就可以操纵它们

  • 我的计划是 使用多线程步骤,以便每个线程读取一条记录-在处理器中生成多条记录-将生成的记录写入单独的excel文件。 使用同步读取器从进程表中读取。 在处理器中,使用读取器中返回的记录查询DB(涉及多个联接)并形成一个复合对象。 用自定义编写器将复合对象写入文件 就内存管理而言,上面的方法听起来不太好。 因为要写入的记录是在处理器中生成的(而不是从读取器那里获得的,读取器只是给出记录ID),所以只

  • 我有一个应用程序,它使用spring 4 . 0 . 1 JPA hiba Nate 4 . 2 . 8(spring的JpaTransactionManager,localcontainereentitymanagerfactorybean,带有HibernateJpaDialect和apache的BasicDataSource作为数据源)进行数据库访问。在某个时刻,应用程序开始一个长时间运行的

  • 给致命的内存分配错误查询读取超过20000记录从数据库,而且它需要太多的时间来加载 因此,请帮助我们出口20000多张唱片。