Spring Boot JdbcTemplate in 语句注意事项
Spring Boot JdbcTemplate Java 大约 1357 字描述
在多条件查询情况下,拼接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}')
阅读 3819 · 发布于 2020-10-09
————        END        ————
Give me a Star, Thanks:)
https://github.com/fendoudebb扫描下方二维码关注公众号和小程序↓↓↓
昵称:
随便看看
换一批
-
面试题:Java 内存结构与内存模型阅读 3353
-
Java 并发编程之 AtomicIntegerFieldUpdater AtomicLongFieldUpdater AtomicReferenceFieldUpdater阅读 1275
-
Java LockSupport 几种唤醒机制阅读 146
-
使用 logrotate 处理日志阅读 3557
-
Linux Centos7 查看 systemctl 有哪些服务阅读 260
-
Windows 后台启动 Nginx、Redis、MongoDB、php-fpm阅读 3179
-
Docker 部署 Alpine Linux阅读 946
-
Java 13 JVM 参数 FlightRecorder 被标记为过时阅读 697
-
软考-系统架构设计师:网络存储技术 - Raid阅读 1979
-
GraalVM 打包成二进制文件时报 gu tool was not found阅读 240