首页 文章

如何使用JPA调用firebird可选存储过程?

提问于
浏览
0

我正在尝试使用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 回答

  • 1

    em.createNamedQuery 第一个参数应该是 NamedQuery (不是JPQL)的名称 . 您将在注释或XML中定义 NamedQuery 本身,并为其指定NAME . 此外,如果您要调用SQL direct(而不是JPQL),则需要一个 NamedNativeQuery ,用于本机查询 .

    JPA 2.1支持存储过程;这是否适用于调用Firebird的东西我不知道,但你也可以尝试一下

  • 1

    是否可以使用JPA调用firebird select过程?

    是的 . 您可以改用 EntityManager#createNativeQuery .

    如果存在Query query = em.createNamedQuery(q,CallProcedureResult.class),为什么“找不到命名查询”;在方法?

    EntityManager#createNamedQuery 的第一个参数必须是 NamedQuery ,它不是,它是您的情况下的实际查询 .

    对于您的问题,Hibernate支持在本机查询中使用命名参数,但它不能在JPA实现中可移植地使用(https://stackoverflow.com/a/28829942/5078385) .

相关问题