当IN子句超过100或1000时,NamedParameterJdbcTemplate不起作用

时间:2014-08-23 14:19:26

标签: java spring

我正在使用NamedParameterJdbcTemplate来运行我的查询。查询如下:

SELECT id, desc FROM tableA WHERE id IN (:custIds);

现在,我正在调用一个Web服务,它正在返回一个id列表。所以我使用NamedParameterJdbcTemplate将id列表映射到“custIds”。但是,当ID列表超过1000时,我遇到了一个问题。我已经读过DB无法处理包含超过100或1000的IN。

由于我仅限于收到ID列表,您能否建议除NamedParameterJdbcTemplate外最好使用什么?

1 个答案:

答案 0 :(得分:3)

您不能在IN子句中使用超过1000个条目。如下所述,解决方案很少:

  • 使用inner query解决此问题。您可以创建临时表并在IN子句中使用它。

示例查询:

select id,desc from table_name where id in (select id from temp_table)
  • 使用由IN子句分隔的多个OR子句在1000个条目的批处理中打破它。

示例查询:

select id,desc from table_name
  where
      id in (1,2,3,...1000)
  or
      id in (1001,1002,1003,...2000)
  or
      id in (2001,2002,...)
  • 使用上面提到的union all代替OR子句,在IN子句中使用1000个条目进行查询

示例查询:

select id,desc from table_name where id in (1,2,3,4,...,1000)
union all
select id,desc from table_name where id in (1001,1002,...2000)
union all
select id,desc from table_name where id in (2001,2002,...)

Read more..并查看Oracle FAQ