Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA/Hibernate:使用输入和输出参数调用存储过程_Java_Spring_Oracle_Hibernate_Jpa - Fatal编程技术网

Java JPA/Hibernate:使用输入和输出参数调用存储过程

Java JPA/Hibernate:使用输入和输出参数调用存储过程,java,spring,oracle,hibernate,jpa,Java,Spring,Oracle,Hibernate,Jpa,我在用JPA调用Java中的排序过程时遇到了一个问题 下面是Java的代码: StoredProcedureQuery storedProcedureQuery = getEntityManager().createNamedStoredProcedureQuery("RECPOCH"); storedProcedureQuery.setParameter(Pochette.SP_RECPOCH_PARAM_STRSTARTSIM, pochetteCriteria.getDebutN

我在用JPA调用Java中的排序过程时遇到了一个问题

下面是Java的代码:

    StoredProcedureQuery storedProcedureQuery = getEntityManager().createNamedStoredProcedureQuery("RECPOCH");

storedProcedureQuery.setParameter(Pochette.SP_RECPOCH_PARAM_STRSTARTSIM, pochetteCriteria.getDebutNumPochette());
storedProcedureQuery.setParameter(Pochette.SP_RECPOCH_PARAM_STRLASTSIM, pochetteCriteria.getFinNumPochette());
storedProcedureQuery.setParameter(Pochette.SP_RECPOCH_PARAM_NACTELID, pochetteCriteria.getActelId());

storedProcedureQuery.execute();
Integer result = (Integer) storedProcedureQuery.getOutputParameterValue(Pochette.SP_RECPOCH_PARAM_NRESULT);

return Long.valueOf(result);
以下是Oracle的代码:

"RECPOCH" ( NACTELID IN NUMBER, STRSTARTSIM IN VARCHAR, STRLASTSIM IN VARCHAR, NRESULT OUT INTEGER )
跟踪异常:
13:24:40.295[http-nio-8080-exec-6]调试o.s.orm.jpa.JpaTransactionManager-参与现有事务
休眠:{调用RECPOCH(?,,,,?)}
javax.persistence.PersistenceException:org.hibernate.exception.genericjdbception:调用CallableStatement.getMoreResults时出错
位于org.hibernate.jpa.internal.storedProcedureRequestyImpl.execute(storedProcedureRequestyImpl.java:230)
位于org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
运行(Thread.java:748)
原因:org.hibernate.exception.genericjdbception:调用CallableStatement.getMoreResults时出错
位于org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:47)
位于org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111)
位于org.hibernate.jpa.internal.storedProcedureRequestyImpl.execute(storedProcedureRequestyImpl.java:223)
... 90多
原因:java.sql.SQLException:Le nombre de noms de paramètre ne concorde pas avec celui des paramètres inscrit
位于oracle.jdbc.driver.OracleSql.setNamedParameters(OracleSql.java:198)
位于org.apache.tomcat.dbcp.dbcp2.DelegatingPreparedStatement.execute(DelegatingPreparedStatement.java:197)
13:24:40.833[http-nio-8080-exec-6]调试o.s.orm.jpa.JpaTransactionManager-启动事务提交
位于org.apache.tomcat.dbcp.dbcp2.DelegatingPreparedStatement.execute(DelegatingPreparedStatement.java:197)
13:24:40.833[http-nio-8080-exec-6]调试o.s.orm.jpa.JpaTransactionManager-在EntityManager[org.hibernate.jpa.internal]上提交jpa事务。EntityManagerImpl@6db6eb5c]
在com.zaxxer.hikari.pool.ProxyPreparedStatement.execute(ProxyPreparedStatement.java:44)
位于com.zaxxer.hikari.pool.HikariProxyCallableStatement.execute(HikariProxyCallableStatement.java)
位于org.hibernate.result.internal.OutputsImpl.(OutputsImpl.java:52)
... 95多

实体中的命名排序过程定义:
@NamedStoredProcedureQueries({
@NamedStoredProcedureQuery(name=Pochette.SP_RECPOCH_name,procedureName=“RECPOCH”,参数={
@StoredProcedureParameter(name=Pochette.SP_RECPOCH_PARAM_NRESULT,mode=ParameterMode.OUT,type=Long.class),
@StoredProcedureParameter(name=Pochette.SP_RECPOCH_PARAM_STRSTARTSIM,mode=ParameterMode.IN,type=String.class),
@StoredProcedureParameter(name=Pochette.SP_RECPOCH_PARAM_STRLASTSIM,mode=ParameterMode.IN,type=String.class),
@StoredProcedureParameter(name=Pochette.SP_RECPOCH_PARAM_NACTELID,mode=ParameterMode.IN,type=Long.class)
})
})

您有什么想法吗?

您还需要注册存储过程的参数,因此您的代码如下所示:

StoredProcedureQuery storedProcedureQuery = getEntityManager().createNamedStoredProcedureQuery("RECPOCH");

storedProcedureQuery.registerStoredProcedureParameter(Pochette.SP_RECPOCH_PARAM_STRSTARTSIM, String.class, ParameterMode.IN);
storedProcedureQuery.setParameter(Pochette.SP_RECPOCH_PARAM_STRSTARTSIM, pochetteCriteria.getDebutNumPochette());

storedProcedureQuery.registerStoredProcedureParameter(Pochette.SP_RECPOCH_PARAM_STRLASTSIM, String.class, ParameterMode.IN);
storedProcedureQuery.setParameter(Pochette.SP_RECPOCH_PARAM_STRLASTSIM, pochetteCriteria.getFinNumPochette());

storedProcedureQuery.registerStoredProcedureParameter(Pochette.SP_RECPOCH_PARAM_NACTELID, Integer.class, ParameterMode.IN);
storedProcedureQuery.setParameter(Pochette.SP_RECPOCH_PARAM_NACTELID, pochetteCriteria.getActelId());

storedProcedureQuery.registerStoredProcedureParameter(Pochette.SP_RECPOCH_PARAM_NRESULT, Integer.class, ParameterMode.OUT);

storedProcedureQuery.execute();

Integer result = (Integer) storedProcedureQuery.getOutputParameterValue(Pochette.SP_RECPOCH_PARAM_NRESULT);

return Long.valueOf(result);

编辑:这对OP问题没有帮助,因为使用了
createNamedStoredProcedureQuery
,它会自动声明和注册参数。为了完整起见,我把它留在这里。

命名存储过程的定义在哪里?根据我在问题中添加的定义,我在实体类中定义了它。也许将参数按与实际存储过程相同的顺序放入NamedStoredProcedureQuery中?应该没关系……是的,我在NamedStoredProcedureRequesty中保持了与oracle declarationTrue相同的顺序,但他(据称)有一个命名存储过程查询,因此在他定义“命名”查询时会自动执行。抱歉,没有看到该部分。我将编辑我的帖子:)不起作用,我有相同的错误,我忘了说我在实体宽度参数中声明了NamedSortedProcess @NamedStoredProcedureQueries({ @NamedStoredProcedureQuery(name = Pochette.SP_RECPOCH_NAME, procedureName = "RECPOCH", parameters = { @StoredProcedureParameter(name = Pochette.SP_RECPOCH_PARAM_NRESULT, mode = ParameterMode.OUT, type = Long.class), @StoredProcedureParameter(name = Pochette.SP_RECPOCH_PARAM_STRSTARTSIM, mode = ParameterMode.IN, type = String.class), @StoredProcedureParameter(name = Pochette.SP_RECPOCH_PARAM_STRLASTSIM, mode = ParameterMode.IN, type = String.class), @StoredProcedureParameter(name = Pochette.SP_RECPOCH_PARAM_NACTELID, mode = ParameterMode.IN, type = Long.class) }) })
StoredProcedureQuery storedProcedureQuery = getEntityManager().createNamedStoredProcedureQuery("RECPOCH");

storedProcedureQuery.registerStoredProcedureParameter(Pochette.SP_RECPOCH_PARAM_STRSTARTSIM, String.class, ParameterMode.IN);
storedProcedureQuery.setParameter(Pochette.SP_RECPOCH_PARAM_STRSTARTSIM, pochetteCriteria.getDebutNumPochette());

storedProcedureQuery.registerStoredProcedureParameter(Pochette.SP_RECPOCH_PARAM_STRLASTSIM, String.class, ParameterMode.IN);
storedProcedureQuery.setParameter(Pochette.SP_RECPOCH_PARAM_STRLASTSIM, pochetteCriteria.getFinNumPochette());

storedProcedureQuery.registerStoredProcedureParameter(Pochette.SP_RECPOCH_PARAM_NACTELID, Integer.class, ParameterMode.IN);
storedProcedureQuery.setParameter(Pochette.SP_RECPOCH_PARAM_NACTELID, pochetteCriteria.getActelId());

storedProcedureQuery.registerStoredProcedureParameter(Pochette.SP_RECPOCH_PARAM_NRESULT, Integer.class, ParameterMode.OUT);

storedProcedureQuery.execute();

Integer result = (Integer) storedProcedureQuery.getOutputParameterValue(Pochette.SP_RECPOCH_PARAM_NRESULT);

return Long.valueOf(result);