JDBI查询使用<>运算符时报语法错误问题咨询
问题产生原因
JDBI的SQL模板解析逻辑中,<是预留的特殊标识字符,用于匹配<占位符名>格式的动态参数(你代码中用到的@BindIn注解就依赖<categories>这种格式的占位符实现参数注入)。
你在SQL中直接写入<>时,JDBI解析器会误将第一个<识别为动态占位符的起始标记,后续找不到合法的占位符名称与对应闭合规则,就会在模板解析阶段直接抛出语法错误,该错误不会传递到PostgreSQL数据库执行阶段就会触发。
你将条件改为> 0后,SQL字符串中没有单独的前置<字符,模板解析逻辑正常运行,因此可以正常执行。
解决方法
如果后续业务场景需要使用不等判断(无法用>0完全替代<>的场景),可采用以下任意方案处理:
- 优先使用PostgreSQL支持的
!=不等号代替<>,二者语义完全等效,且!不会被JDBI识别为特殊字符,无需额外转义即可正常解析。 - 对
<字符做JDBI转义处理,JDBI 3.x及以上版本支持用\\<转义<为普通字符,原条件可修改为\\<> 0即可正常解析。 - 将不等判断的值改为绑定参数形式,避免特殊字符出现在静态SQL字符串中:
调用方法时传入0作为@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);excludeStatus的值即可。
内容的提问来源于stack exchange,提问作者Aakash Verma
相关产品推荐
相关产品推荐

