Quarkus JDBI绑定数组查询参数遇ORA-17287错误,求适配配置
解决Quarkus JDBI绑定List参数时的ORA-17287错误
问题根源
Oracle JDBC驱动不支持JDBC标准的createArrayOf方法,而JDBI默认通过该方法绑定List类型参数。当你用bindBean绑定包含List属性的实体时,JDBI尝试将List转换为SQL数组,直接触发了这个不支持的操作,抛出ORA-17287错误。
针对性解决方案
要在通用方法中兼容List类型参数,需要替换JDBI默认的List绑定逻辑,改用适合Oracle的IN子句参数绑定方式,具体步骤如下:
1. 修改通用方法的绑定逻辑
替换原有的bindBean,通过反射遍历实体属性,对List类型使用JDBI内置的bindList方法,其他类型使用普通bind:
public <T> List<T> get(T entity, String selectQuery) { try { Class<T> entityClass = (Class<T>) entity.getClass(); return jdbi.withHandle(handle -> { Query query = handle.createQuery(selectQuery); // 遍历实体所有字段,按需绑定 for (Field field : entityClass.getDeclaredFields()) { field.setAccessible(true); Object fieldValue = field.get(entity); if (fieldValue instanceof List<?> listValue) { // 绑定List为IN子句参数,SQL中占位符对应字段名(如:userIds) query.bindList(field.getName(), listValue); } else { query.bind(field.getName(), fieldValue); } } return query.mapTo(entityClass).list(); }); } catch (Exception e) { e.printStackTrace(); } return null; }
2. 验证SQL占位符格式
确保查询SQL中,List类型对应的占位符是单个名称(比如WHERE id IN (:userIds)),JDBI的bindList会自动将其替换为WHERE id IN (?, ?, ?)并绑定所有List元素,完全避开createArrayOf操作。
补充说明
- 如果实体中有嵌套的List属性,需要在反射遍历中增加递归处理逻辑。
- 该方案完全兼容原有其他类型参数的绑定逻辑,无需修改其他调用处的代码。
内容的提问来源于stack exchange,提问作者jayasree
相关产品推荐
相关产品推荐

