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

时间:2016-08-25 15:17:40

标签: java jpa stored-procedures firebird

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

  • 是否可以使用JPA调用firebird select过程?
  • 如果方法中有Query query = em.createNamedQuery(q, CallProcedureResult.class);,为什么“找不到命名查询”?

2 个答案:

答案 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,而不是,在您的情况下它是一个实际查询。

Hibernate支持在本机查询中使用命名参数

不相关,但它无法在JPA实现(https://stackoverflow.com/a/28829942/5078385)中使用。