You need to enable JavaScript to run this app. JDBI查询使用<>运算符时报语法错误问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

JDBI查询使用<>运算符时报语法错误问题咨询

问题产生原因

JDBI的SQL模板解析逻辑中,<是预留的特殊标识字符,用于匹配<占位符名>格式的动态参数(你代码中用到的@BindIn注解就依赖<categories>这种格式的占位符实现参数注入)。

你在SQL中直接写入<>时,JDBI解析器会误将第一个<识别为动态占位符的起始标记,后续找不到合法的占位符名称与对应闭合规则,就会在模板解析阶段直接抛出语法错误,该错误不会传递到PostgreSQL数据库执行阶段就会触发。
你将条件改为> 0后,SQL字符串中没有单独的前置<字符,模板解析逻辑正常运行,因此可以正常执行。

解决方法

如果后续业务场景需要使用不等判断(无法用>0完全替代<>的场景),可采用以下任意方案处理:

  • 优先使用PostgreSQL支持的!=不等号代替<>,二者语义完全等效,且!不会被JDBI识别为特殊字符,无需额外转义即可正常解析。
  • 对<字符做JDBI转义处理,JDBI 3.x及以上版本支持用\\<转义<为普通字符,原条件可修改为\\<> 0即可正常解析。
  • 将不等判断的值改为绑定参数形式,避免特殊字符出现在静态SQL字符串中:
    @Override
    @SqlQuery("SELECT COUNT(*) FROM " + TABLE_NAME + " WHERE (" + COLUMN_MODERATOR_CATEGORY_ID
                    + " in (<categories>) OR " + COLUMN_EXPERT_CATEGORY_ID
                    + " in (<categories>)) AND (" + COLUMN_STATUS + " != :excludeStatus)")
    long getIdeasCountInCategories(@BindIn("categories") List<Long> categories, @Bind("excludeStatus") int excludeStatus);
    
    调用方法时传入0作为excludeStatus的值即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 01:00:05