使用新的JPA 2.1 stored procedure調用,有沒有辦法傳遞一個空參數?是否可以在Java JPA 2.1中將空參數傳遞給存儲過程?
下面是一個例子用法:
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();
這工作時,所有的參數,但是當c
是null
它會失敗,並從(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類型。
有沒有辦法傳遞一個空參數?
你被定義類型調用registerStoredProcedureParameter,以便您可能有提供程序錯誤或配置問題。你使用什麼提供者和版本? – Chris
我開箱使用WildFly 8.0.0.Final,它在內部使用Hibernate 4.3.1。我更新了最新的適當的Postgres驅動程序,它是[9.3.1101](http://jdbc.postgresql.org/download.html)。 – Pool
要使InputParameters類正常工作,您的過程需要採用結構類型,並且您的提供程序支持將Java類轉換爲結構。請參閱http://en.wikibooks.org/wiki/Java_Persistence/Advanced_Topics#Structured_Object-Relational_Data_Types。 – Chris