java - 是否可以将 null 参数传递给 Java JPA 2.1 中的存储过程?

标签 java jpa stored-procedures

使用新的 JPA 2.1 stored procedure调用,有什么方法可以传递空参数吗?

这是一个用法示例:

StoredProcedureQuery storedProcedure = em.createStoredProcedureQuery("get_item", Item.class);
storedProcedure.registerStoredProcedureParameter(0, String.class, ParameterMode.IN);
storedProcedure.registerStoredProcedureParameter(1, String.class, ParameterMode.IN);
storedProcedure.registerStoredProcedureParameter(2, Timestamp.class, ParameterMode.IN);

storedProcedure.setParameter(0, a);
storedProcedure.setParameter(1, b);
storedProcedure.setParameter(2, c);

storedProcedure.execute();

这在给定所有参数时有效,但当 cnull 时,它会失败并出现来自 (PostgreSQL) JDBC 驱动程序的错误。

Caused by: org.postgresql.util.PSQLException: No value specified for parameter 2
at org.postgresql.core.v3.SimpleParameterList.checkAllParametersSet(SimpleParameterList.java:216) [postgresql-9.3-1101.jdbc41.jar:]
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:244) [postgresql-9.3-1101.jdbc41.jar:]
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:559) [postgresql-9.3-1101.jdbc41.jar:]
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:417) [postgresql-9.3-1101.jdbc41.jar:]
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:410) [postgresql-9.3-1101.jdbc41.jar:]
    at org.jboss.jca.adapters.jdbc.WrappedPreparedStatement.execute(WrappedPreparedStatement.java:404)
    at org.hibernate.result.internal.OutputsImpl.<init>(OutputsImpl.java:69) [hibernate-core-4.3.1.Final.jar:4.3.1.Final]
    ... 244 more

我也考虑过使用我自己的类来传递参数,例如:

storedProcedure.registerStoredProcedureParameter(0, InputParameters.class, ParameterMode.IN);
storedProcedure.setParameter(0, inputParameters);

这失败了:

Caused by: java.lang.IllegalArgumentException: Type cannot be null

我猜是因为它需要一个可以映射到 SQL 类型的类型。

有没有办法传递空参数?

最佳答案

是的,在使用 JPA 时可以将 null 参数传递给存储过程 存储过程查询。

您必须在 application.properties 文件中添加以下属性,并使用它们的名称注册参数。

spring.jpa.properties.hibernate.proc.param_null_passing=true

例子:

StoredProcedureQuery q = em.createStoredProcedureQuery(Globals.SPROC_PROBLEM_COMMENT2, ProblemCommentVO.class);
q.registerStoredProcedureParameter("Patient_ID", Long.class, ParameterMode.IN);
q.registerStoredProcedureParameter("Param2", Long.class, ParameterMode.IN);
q.registerStoredProcedureParameter("Param3", Long.class, ParameterMode.IN);
q.registerStoredProcedureParameter("Param4", Integer.class, ParameterMode.OUT);
q.setParameter("Patient_ID", patientId);
q.setParameter("Param2", null);//passing null value to Param2
q.setParameter("Param3", null);

List<ProblemCommentVO> pComments = q.getResultList();
Integer a = (Integer) q.getOutputParameterValue("Param4");

关于java - 是否可以将 null 参数传递给 Java JPA 2.1 中的存储过程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58273509/

相关文章:

java - java中的绘图框架

java - 如何将隐藏字段数组发送到 servlet?

JAVA继承(找不到区别)

java - 无法从 MapReduce 代码访问 HBase

java - Spring Hibernate : Entity seems not persisted, 也没有失败

java - 可以使用子类实体查询数据库

mysql - 水平列出 mysql 行值而不旋转

Oracle PL/SQL 存储过程编译器与 PostgreSQL PGSQL 存储过程编译器

java - 如何使用 Spring Roo 和 JPA 提供我自己的 @id 字段

sql - 在 sys.servers 中找不到服务器 'server name'。 SQL Server 2014