通过将String
[]类型的Java数组传递给您进行测试,以进行测试
PreparedStatement.setObject(...)。似乎PgJDBC不接受Java数组作为
PreparedStatement.setObject()带有或不带有
Types.ARRAY参数的参数。
合规
JDBC规范 16.5“数组对象” 建议JDBC
Array部分存在,因此客户端不必将大数组复制到内存中,可以将其用作引用。我不太确定是否需要JDBC驱动程序才能接受原始Java数组作为参数。所有规范代码都引用了
java.sql.Array该规范,并且该规范明确指出,数组是通过
Array附录B和其他地方的接口映射的。在快速搜索/阅读中,除了作为参数或作为结果返回之外,我
没有 提到传递原始Java数组
byte[]。
但是,在§16.5.4中,JDBC4.2规范草案如下:
A Java array may be passed as an input parameter by calling the methodPreparedSatement.setObject.
尽管那里的所有其余代码都指向
Array对象。它们的意思
Array是“ Java数组”吗?还是它们意味着原始的原生Java数组
String[]?
在我看来,客户端应该通过使用
java.sql.Array接口
Connection.createArrayOf(...),因此Eclipselink可能做错了事。
该怎么办
尝试将Eclipselink更新为2.4,希望它使用通过java.sql.Array对象将数组传递给JDBC的常用方法。
您可能还需要使用
@ArrayEclipselink扩展名对映射进行注释。另请参见此论坛线程re
2.3和bug
361701。
看来您可能必须为Eclipselink实现自己的类型处理程序,才能覆盖其行为。要通过PgJDBC正确设置数组参数,您必须使用:
Array sqlArray = conn.createArrayOf("text", strArray); pstmt.setArray(1, sqlArray); pstmt.executeUpdate();…其中
conn和
pstmt分别是a
java.sql.Connection和a
PreparedStatement,并且
strArray是一个
String[]实例。
请参阅eclipselink
Wiki中的“定制数据类型”。
另外,
createArrayOf鉴于存在,使用字符串类型名称来指定数组的数据类型似乎有点疯狂
java.sql.Types。它使可移植性变得更加困难。上面的代码无法在(例如)Oracle上运行,因为Oracle不想
VARCHAR将其
text用作类型名称。
注意:单元测试
org/postgresql/test/jdbc2/ArrayTest.java具有
ArrayTest.testSetArray(),在第166行进行测试:
pstmt.setObject(1, arr); pstmt.executeUpdate();
… …但是类型
arr是
java.sql.Array,没有
int[]。这是JDBC数组类型,而不是常规Java数组。


![如何为本地查询设置String []参数? 如何为本地查询设置String []参数?](http://www.mshxw.com/aiimages/31/470020.png)
