You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 13:10:49