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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 16:20:07