如何在JDBI SQL注解中使用LIKE查询CLOB列
解决JDBI中LIKE查询CLOB列的参数绑定问题
你遇到的问题核心是JDBI参数绑定规则与SQL语法的冲突,以下是几种可行的正确写法:
方法1:在SQL中用字符串拼接函数拼接通配符
直接在SQL语句里通过数据库的字符串拼接函数,把%和绑定参数拼接起来,不同数据库的拼接方式略有差异:
适配MySQL/Oracle的CONCAT写法
@SqlQuery("SELECT * FROM users WHERE roles LIKE CONCAT('%', :role, '%')") fun findAllByRole(@Bind("role") role: String): List<UserRecord>
适配PostgreSQL/Oracle的||拼接写法
如果你的数据库支持||作为字符串连接运算符(比如PostgreSQL、Oracle),可以这么写:
@SqlQuery("SELECT * FROM users WHERE roles LIKE '%' || :role || '%'") fun findAllByRole(@Bind("role") role: String): List<UserRecord>
方法2:在代码层给参数添加通配符
在调用DAO方法前,先给传入的role参数前后加上%,再直接在SQL中绑定处理后的参数:
注解式写法(外部传入处理后的参数)
@SqlQuery("SELECT * FROM users WHERE roles LIKE :role") fun findAllByRole(@Bind("role") role: String): List<UserRecord> // 调用时传入带通配符的参数 val adminUsers = dao.findAllByRole("%ADMIN%")
DAO方法内部封装参数处理
fun findAllByRole(role: String): List<UserRecord> { val wrappedRole = "%$role%" return handle.createQuery("SELECT * FROM users WHERE roles LIKE :role") .bind("role", wrappedRole) .mapTo(UserRecord::class.java) .list() }
为什么之前的写法无效?
@SqlQuery("SELECT * FROM users WHERE roles LIKE %:role%"):SQL语法错误,数据库会将%:role%视为完整字符串,不会解析其中的:role占位符@SqlQuery("SELECT * FROM users WHERE roles LIKE '%:role%'"):引号内的:role不会被JDBI识别为绑定参数,实际查询的是包含字符串:role的记录@SqlQuery("SELECT * FROM users WHERE roles LIKE :role"):参数值是ADMIN,相当于执行LIKE 'ADMIN',只会匹配完全等于ADMIN的记录,而非包含它的记录
另外说明:CLOB列的LIKE查询和普通字符串列语法一致,只要你的数据库支持对CLOB类型执行LIKE操作(主流数据库如Oracle、MySQL、PostgreSQL均支持),以上方法都适用。
内容的提问来源于stack exchange,提问作者Viktor Baert
相关产品推荐
相关产品推荐

