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
————        END        ————