java - 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:我正在寻找一种在一次提交中处理它的解决方案;
解决方案
绕过IN
限制是低效的,JPA 并不总是适合这项工作的工具。考虑以下:
数以千计的绑定值可能会产生数兆字节的 SQL。将此 SQL 发送到数据库需要很长时间。根据Tom 对“限制和转换非常长的 IN 列表:WHERE x IN (,,, ...)”问题的回答,数据库可能需要更长的时间来读取 SQL 文本而不是执行它。
由于 SQL 解析,这将是低效的。不仅解析这个长 SQL 需要很长时间,而且每次调用都有不同数量的绑定参数,这些参数将被单独解析和计划(请参阅这篇解释它的文章)。
SQL 语句中的绑定参数有硬性限制。您可以重复
OR
几次以绕过IN
限制,但您将在某个时候达到 SQL 语句限制。
对于这些类型的查询,通常最好创建临时表。在查询之前创建一个,将所有标识符插入其中,并将其与查询中的实体表连接以模拟IN
条件。
理想情况下,您可以用存储过程替换 JPA,尤其是当您从数据库中提取数以万计的标识符只是为了在下一个查询中将它们传回数据库时。
推荐阅读
- php - 反馈后无法滚动
- excel - 如果条件相同,则减去一个单元格(如果它有 # 值),其下方的行在不同的列中
- r - 使用R中的pagedown包函数chrome_print()转换为pdf
- machine-learning - XGBoost - 使用不带标签的 DMatrix 进行预测
- heroku - 在终端中更改 Heroku 应用程序名称别名
- python - Kivy,在 __init__ 之后调用一个函数
- c# - 安装的 NuGet 抛出 System.IO.FileNotFoundException
- python - 通过服务帐户访问 Google Admin API
- json - 如何在 React JS 中获取 API?
- php - Nipper Studio XML 解析器