JDBC PreparedStatement传递PostgreSQL ltree[]参数报错求助
解决方案
1. 修正SQL语句
将IN (?)替换为= ANY(?)——PostgreSQL中ANY操作符专门适配数组类型参数,用于匹配数组内的任意元素:
PreparedStatement myStatement = connection.prepareStatement( """ SELECT path FROM my_table WHERE path = ANY ( ? ) """);
2. 修正数组类型参数
createArrayOf方法的第一个参数是数组元素的类型名,而非数组类型名,因此把"ltree[]"改为"ltree":
ArrayList<String> listWithQuotes = new ArrayList<>(); listWithQuotes.add("A.B.C"); listWithQuotes.add("A.B"); // 传入元素类型"ltree",驱动自动处理为ltree[]数组类型 Array array = connection.createArrayOf("ltree", listWithQuotes.toArray()); myStatement.setArray(1, array); ResultSet rs = myStatement.executeQuery();
关键说明
IN语法仅适用于逗号分隔的静态列表,无法直接匹配JDBC传递的Array对象,而= ANY(?)是PostgreSQL中数组元素匹配的标准写法。createArrayOf要求传入的是基础类型名(如ltree),驱动会自动将其封装为对应数组类型(ltree[])发送给数据库,无需手动添加[]后缀。
内容的提问来源于stack exchange,提问作者P. M.
相关产品推荐
相关产品推荐

