首页 > 解决方案 > JPA 和 1000 ID 在 Oracle IN 运算符中的使用

问题描述

我使用 NamedNativeQuery 删除行,它是这样的:

DELETE from FAKTOR
 where ID IN (
   select fa.ID
   from FAKTOR fa
     left join FAKTOR_REASON fars
       on fa.FARS_ID = fars.ID
   where fars.ID = 63
         and fa.USER_ID in (:userIds))

但是我如何在 Oracle 的 IN 运算符中使用超过 1000 个用户 ID 有什么线索?

PS:我正在寻找一种在一次提交中处理它的解决方案;

标签: javaoraclehibernatejpaoracle11g

解决方案


绕过IN限制是低效的,JPA 并不总是适合这项工作的工具。考虑以下:

  1. 数以千计的绑定值可能会产生数兆字节的 SQL。将此 SQL 发送到数据库需要很长时间。根据Tom 对“限制和转换非常长的 IN 列表:WHERE x IN (,,, ...)”问题的回答,数据库可能需要更长的时间来读取 SQL 文本而不是执行它。

  2. 由于 SQL 解析,这将是低效的。不仅解析这个长 SQL 需要很长时间,而且每次调用都有不同数量的绑定参数,这些参数将被单独解析和计划(请参阅这篇解释它的文章)。

  3. SQL 语句中的绑定参数有硬性限制。您可以重复OR几次以绕过IN限制,但您将在某个时候达到 SQL 语句限制。

对于这些类型的查询,通常最好创建临时表。在查询之前创建一个,将所有标识符插入其中,并将其与查询中的实体表连接以模拟IN条件。

理想情况下,您可以用存储过程替换 JPA,尤其是当您从数据库中提取数以万计的标识符只是为了在下一个查询中将它们传回数据库时。


推荐阅读