Spring Boot JdbcTemplate in 语句注意事项
Spring Boot JdbcTemplate Java About 1,357 words描述
在多条件查询情况下,拼接SQL
语句时使用到了in
关键词不管参数传入List
集合还是Array
数组,等到的结果集都是空。
// MySQL
List<String> 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<OrderTest> 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,586 · Posted: 2020-10-09
————        END        ————
Give me a Star, Thanks:)
https://github.com/fendoudebb/LiteNote扫描下方二维码关注公众号和小程序↓↓↓
Loading...