我正在尝试使用JPA调用Firebird可选择的过程。该方法如下:
public void addLineToBrokerReport(Map<String, Object> parametersForAddDealsProc) {
MapUtils.debugPrint(System.out, "Parameters for procedure", parametersForAddDealsProc);
String q = "select a.dol as id, a.out$error_code as error_code " +
"from ADD_LINE (:IN$DOC," +
":IN$SHARE, " +
":IN$B_ACC, " +
":IN$S_ACC, " +
":IN$COMMENT) a";
Query query = em.createNamedQuery(q, CallProcedureResult.class);
for (Map.Entry<String, Object> entry : parametersForAddDealsProc.entrySet()) {
query.setParameter("\"" + entry.getKey()+ "\"", entry.getValue());
}
CallProcedureResult result = (CallProcedureResult) query.getSingleResult();
LOG.info("Error_code = " + result.getError_code() + " dol = " + result.getId());
}
调用后返回下一个错误:
java.lang.IllegalArgumentException:找不到命名查询:select a.dol as id,a.out $ error_code as error_code from P_TDA_ADD_LINE_TO_BROKER_REP(:IN $ DOC,:IN $ SHARE,:IN $ B_ACC,:IN $ S_ACC, :IN $ COMMENT)a
在 org.hibernate.ejb.AbstractEntityManagerImpl.createNamedQuery(AbstractEntityManagerImpl.java:665) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在java.lang.reflect.Method.invoke(Method.java:498)at org.springframework.orm.jpa.ExtendedEntityManagerCreator $ ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:344) 在com.sun.proxy。$ Proxy33.createNamedQuery(未知来源)at com.comp.app.TradesUpload.TradesUpload.addLineToBrokerReport(TradesUpload.java:454) 在 com.comp.app.TradesUpload.TradesUploadTest.addLineToBrokerReport(TradesUploadTest.java:69) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在java.lang.reflect.Method.invoke(Method.java:498)at org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall(FrameworkMethod.java:50) 在 org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 在 org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 在 org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 在org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 在 org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 在org.junit.runners.ParentRunner $ 3.run(ParentRunner.java:290)at at org.junit.runners.ParentRunner $ 1.schedule(ParentRunner.java:71)at at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)at at org.junit.runners.ParentRunner.access $ 000(ParentRunner.java:58)at at org.junit.runners.ParentRunner $ 2.evaluate(ParentRunner.java:268)at at org.junit.runners.ParentRunner.run(ParentRunner.java:363)at at org.junit.runner.JUnitCore.run(JUnitCore.java:137)at at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:119) 在 com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:42) 在 com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:234) 在 com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:74) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在java.lang.reflect.Method.invoke(Method.java:498)at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
Query query =
em.createNamedQuery(q, CallProcedureResult.class);
,为什么“找不到命名查询”?答案 0 :(得分:1)
em.createNamedQuery
第一个参数应该是NamedQuery
(不是JPQL)的名称。您将在注释或XML中定义的NamedQuery
本身,并针对它指定NAME。另外,如果您要调用SQL direct(而不是JPQL),则需要一个NamedNativeQuery
用于本机查询。
JPA 2.1支持存储过程;是否可以用于调用Firebird的东西我不知道,但你也可以尝试一下
答案 1 :(得分:1)
是否可以使用JPA调用firebird select过程?
是的。您可以改为使用EntityManager#createNativeQuery
。
为什么&#34;未找到命名查询&#34;如果方法中有
Query query = em.createNamedQuery(q, CallProcedureResult.class);
?
EntityManager#createNamedQuery
的第一个参数必须是NamedQuery
,而不是,在您的情况下它是一个实际查询。
不相关,但它无法在JPA实现(https://stackoverflow.com/a/28829942/5078385)中使用。