添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
List orderIds = new ArrayList<>(); orderIds.add("abc123456789"); orderIds.add("xyz123456789"); String sql = "select id, ordr_id from test_order where order_id in (?)"; Object[] args = new Object[1]; args[0] = orderIds; List orders = jdbcTemplate.query(sql, args, BeanPropertyRowMapper.newInstance(OrderTest.class));

MySQL PostgreSQL 两种数据库情况不一样。

MySQL

JdbcTemplate 在替换 in 的占位符 ? 时,将 List Array 替换为普通字符使用单引号标注,即 'xxx' ,执行的 SQL 类似以下语句,而 in 语句对于不满足条件的查询将返回空集合。

select id, ordr_id from test_order where order_id in ('abc,def,xyz')

若单纯传入的参数为 "1,2,3,4,5" ,则将格式化为 in ('1,2,3,4,5') ,而 MySQL in 条件将只匹配改字符串的第一个逗号前的条件,即等同于 in (1)

PostgreSQL

对于 PostgreSQL 使用 in 条件将会报错。

MySQL

可以直接使用 in(%s) String.format() ,格式化 in 条件。

推荐使用 NamedParameterJdbcTemplate 代替 JdbcTemplate

PostgreSQL

可以使用 order_id = any(?) 来代替 order_id in (?)

//PostgreSQL
List<String> orderIds = new ArrayList<>();
orderIds.add("abc123456789");
orderIds.add("xyz123456789");
String sql = "select id, ordr_id from test_order where order_id = any(?)";
Object[] args = new Object[1];
args[0] = orderIds;
List<OrderTest> orders = jdbcTemplate.query(sql, args, BeanPropertyRowMapper.newInstance(OrderTest.class));
select id, ordr_id from test_order where order_id = any('{abc123456789, xyz123456789}')
Views: 4,299 · Posted: 2020-10-09 ————&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbspEND&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp————