我正在尝试使用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:找不到命名查询:选择a.dol作为id,a.out $ error_code作为error_code来自P_TDA_ADD_LINE_TO_BROKER_REP(:IN $ DOC,:IN $ SHARE,:IN $ B_ACC,:IN $ S_ACC,: IN $ COMMENT)a atg.hibernate.ejb.AbstractEntityManagerImpl.createNamedQuery(AbstractEntityManagerImpl.java:665)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at在org.springframework.orm.jpa.ExtendedEntityManagerCreator $ ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:)的java.lang.reflect.Method.invoke(Method.java:498)中的sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43): 344)com.sun.proxy . $ Proxy33.createNamedQuery(Unknown Source)at com.comp.app.TradesUpload.TradesUpload.addLineToBrokerReport(TradesUpload.java:454)at com.comp.app.TradesUpload.TradesUploadTest.addLineToBrokerReport(TradesUploadTest) .java:69)at sun.reflect.NativeMethod在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)的sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)上的AccessorImpl.invoke0(本地方法),位于java.lang.reflect.Method.invoke(方法 . java:498)org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall(FrameworkMethod.java:50)org.junit上的org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) . runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)org.junit.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)org.junit.runners.ParentRunner.runLeaf(ParentRunner.java: 325)org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)at org.junit.runners.ParentRunner $ 3.run(ParentRunner . java:290)org.junit.runners.ParentRunner $ 1.schedule(ParentRunner.java:71)at org.junit.runners.ParentRunn er.runChildren(ParentRunner.java:288)org.junit.runners.ParentRunner.access $ 000(ParentRunner.java:58)org.junit.runners.ParentRunner $ 2.evaluate(ParentRunner.java:268)org.junit .runners.ParentRunner.run(ParentRunner.java:363)位于com的com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:119)的org.junit.runner.JUnitCore.run(JUnitCore.java:137) . intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:42)at com.intellij.rt.exe.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:234)at com.intellij.rt.execution.junit.JUnitStarter.main( JUnitStarter.java:74)sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java com.intellij.rt.execution.application.AppMain.main中的.lang.reflect.Method.invoke(Method.java:498)(AppMain.java:14 4)
-
是否可以使用JPA调用firebird select过程?
-
如果方法中有
Query query = em.createNamedQuery(q, CallProcedureResult.class);
,为什么"Named query not found"?
2 回答
em.createNamedQuery
第一个参数应该是NamedQuery
(不是JPQL)的名称 . 您将在注释或XML中定义NamedQuery
本身,并为其指定NAME . 此外,如果您要调用SQL direct(而不是JPQL),则需要一个NamedNativeQuery
,用于本机查询 .JPA 2.1支持存储过程;这是否适用于调用Firebird的东西我不知道,但你也可以尝试一下
是的 . 您可以改用
EntityManager#createNativeQuery
.EntityManager#createNamedQuery
的第一个参数必须是NamedQuery
,它不是,它是您的情况下的实际查询 .对于您的问题,Hibernate支持在本机查询中使用命名参数,但它不能在JPA实现中可移植地使用(https://stackoverflow.com/a/28829942/5078385) .