这是我的PostgreSQL函数:
salvarArquivoGeometricoCasoZeroPOINT
(dimensao text,tableName text,tuplas text[],srid text)
它有一个text[]
参数,我想通过String[]
JPQL 将Java传递给它:
public String salvarGeometriaCaso0(String[] tuplas,FileDto arquivo){
Query query =
em().createNativeQuery("select
salvarArquivoGeometricoCasoZeroPOINT(?1,?2,?3,?4)");
query.setParameter(1,arquivo.getGeo());//String
query.setParameter(2,arquivo.getTable());/String
query.setParameter(3,tuplas);//String[]
query.setParameter(4,arquivo.getSrid());//String
return (String) query.getSingleResult();//function returns a Text, so cast to String
}
上面的代码失败,但例外:
ERROR] Internal Exception: org.postgresql.util.PSQLException: Can not infer a SQL
type to use for an instance of [Ljava.lang.String;.
Use setObject () with an explicit Types value to specify the type to use.
所以我不确定如何从EclipseLink调用我的函数。
通过将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 method
PreparedSatement.setObject.
尽管那里的所有其余代码都指向Array
对象。它们的意思Array
是“ Java数组”吗?还是它们意味着原始的原生Java数组String[]
?
在我看来,客户端应该通过使用java.sql.Array
接口Connection.createArrayOf(...)
,因此EclipseLink可能做错了事。
尝试将EclipseLink更新为2.4,希望它使用通过java.sql.Array对象将数组传递给JDBC的常用方法。
您可能还需要使用@Array
EclipseLink扩展名对映射进行注释。另请参见此论坛线程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数组。
问题内容: 嗨,我有一个命名查询 我想这样设置限制: 但这在服务器启动时显示错误。我正在使用以下代码在DAO类中调用查询: 需要设置开始和结束参数。请帮忙。 问题答案: 正如@DataNucleus所说,LIMIT在JPQL中不是有效的关键字。这不是指定要返回多少行的方法。这是您的操作方式: 这将是调用命名查询的代码:
问题内容: 给出以下HQL查询: 我使用Query对象的方法进行设置。 我想使用对象进行设置,但是在查看Hibernate文档和方法列表时,我看不出要使用哪种明显的选择。有任何想法吗? 问题答案: 使用,的Javadoc在这里。 有四种变体可供选择。
问题内容: 这是我的代码部分: 有时可以为null(Date类对象)。如果为null,则会引发以下异常: 如何使此代码正常工作并将null值持久保存到数据库中? 问题答案: 您正在使用postgresql(已经在堆栈中进行了说明),并且可能正在使用Hibernate,几乎可以肯定会遇到此问题:PostgreSQL JDBCNull String作为bytea 因此,这意味着转义到Hibernate
问题内容: 我有一个实体: 我在说。这是我的DAO方法: 日志说: 请求处理失败;嵌套的异常是java.lang.NullPointerException 并将指针放在这一行: 有时必须为null。那么如何设置null? 问题答案: 如果您查看Query类的文档,setInteger()方法, 它以名称和 原始类型int 作为参数。 当您在 自动装箱 期间传递值为null的包装器类型Integer
问题内容: 假设上一课,您如何找到具有特定电子邮件地址的? 这样做简单吗,还是有适当的方法? 问题答案: 那并没那么简单。JPQL 为此提供了运营商: “旧”方式(类似于SQL)是:
问题内容: 例如,我有此查询 我想将ID设置为列表(1,2,3,4,5,6,17,19)。 此代码不起作用 结果,我想有这样的SQL查询 问题答案: 使用。您还必须在列表参数周围加上括号。