Spring Data Repository动态查找器Oracle In子句最大值为1000

bla*_*ic2 10 java oracle spring spring-data

我想知道是否有一种机制可以将超过1000个项目的集合处理到Spring Repository中以获取SQL IN子句.现在,我们在将项目列表传递到存储库之前拆分项目列表,但是如果驱动程序或弹簧知道Oracle的限制,那将会很好,并且会为我们工作.

Kar*_*cki 8

围绕IN限制工作是低效的,Spring Data并不总是适合这项工作的工具.考虑以下:

  1. 成千上万的绑定值将导致潜在的兆字节SQL.将此SQL发送到数据库需要很长时间.根据Tom对"限制和转换很长的IN列表:WHERE x IN(,,, ...)"问题的回答,数据库读取SQL文本可能比执行它要花费更长的时间.

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

  3. SQL语句中的绑定参数存在硬限制.您可以重复OR几次以解决IN限制,但是您将在某个时刻达到SQL语句限制.

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

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