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

JDBI3使用IN子句时抛出UnableToCreateStatementException问题求助

解决JDBI3搭配H2数据库时IN子句的语法错误问题

核心错误原因

你的代码存在两个关键语法问题,导致H2数据库无法正确解析SQL语句:

  1. SQL参数绑定时缺少空格::mAND将参数名:m与关键字AND连在一起,JDBI无法正确识别参数,生成了错误的SQL结构。
  2. values是H2的保留关键字,直接作为列名使用会触发语法解析异常。

修复方案

1. 修正SQL语句和参数绑定

修改@SqlQuery中的SQL内容,修复空格问题并转义关键字:

@SqlQuery("SELECT * FROM TABLEA WHERE m = :m AND `values` IN (<values>)")
@RegisterRowMapper(TableARsMapper.class)
Optional<TableAObject> getByValues(@BindList("values") List<String> values, @Bind("m") String m);
  • 把:mAND改为:m AND,确保参数名与关键字分离,JDBI能正确识别:m参数。
  • 用反引号`包裹values列名(H2也支持双引号"values"),避免被识别为SQL关键字。

2. 修正RowMapper泛型类型

你的TableARsMapper泛型声明与返回类型不匹配,会导致后续类型转换异常,需修正为:

public class TableARsMapper implements RowMapper<TableAObject> {

    @Override
    public TableAObject map(ResultSet r, StatementContext ctx) throws SQLException {
        // 实现结果集到TableAObject的映射逻辑
    }
}

内容的提问来源于stack exchange,提问作者mdc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 18:31:50