当前位置: 首页 > 面试题库 >

如何为本地查询设置String []参数?

曾丰茂
2023-03-14
问题内容

这是我的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的常用方法。

您可能还需要使用@ArrayEclipseLink扩展名对映射进行注释。另请参见此论坛线程re
2.3和bug
361701。

看来您可能必须为EclipseLink实现自己的类型处理程序,才能覆盖其行为。要通过PgJDBC正确设置数组参数,您必须使用:

    Array sqlArray = conn.createArrayOf("text", strArray);
    pstmt.setArray(1, sqlArray);
    pstmt.executeUpdate();

…其中connpstmt分别是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();

… …但是类型arrjava.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查询 问题答案: 使用。您还必须在列表参数周围加上括号。