Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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
在JPA2.0中执行存储过程_Jpa_Stored Procedures - Fatal编程技术网

在JPA2.0中执行存储过程

在JPA2.0中执行存储过程,jpa,stored-procedures,Jpa,Stored Procedures,我有以下问题,我不知道如何解决它。 在我的MSSQL Server 2008上,我有一个存储过程,其中一个参数是日期,格式为:yyyy-MM-dd。 然后我有一个@Entity类,它带有一个@NamedNativeRequesty: @NamedNativeQuery(name = "my_stored_proc",query = "? = exec EMIR_GUI.get_OTCLite_ACKNACK_Report ?", resultClass = EmirFacade.class) @

我有以下问题,我不知道如何解决它。 在我的MSSQL Server 2008上,我有一个存储过程,其中一个参数是日期,格式为:yyyy-MM-dd。 然后我有一个@Entity类,它带有一个@NamedNativeRequesty:

@NamedNativeQuery(name = "my_stored_proc",query = "? = exec EMIR_GUI.get_OTCLite_ACKNACK_Report ?", resultClass = EmirFacade.class)
@Entity
public class EmirFacade {   
@Column(name="MessageType", nullable=false)
@Basic(fetch = FetchType.EAGER)
private String mesageType;
我的Bean类如下所示:

    @PersistenceContext(unitName=Globals.__TWHUNITNAME)
private EntityManager em;

public List<EmirFacade> get_EmirReport(Date date) {
    try {
        @SuppressWarnings("unchecked")
        Query q = em.createNamedQuery("my_stored_proc").setParameter(1, date);
        List<EmirFacade> emir_report = q.getResultList();
        //List emir_report = q.getResultList();
        return emir_report;
    } catch (Exception e) {
        return Collections.emptyList();
    }
}
现在,我总是收到下面的错误信息,它是德语的,所以我必须尽可能好地翻译它 索引0超出范围

我几乎什么都试过了,但找不到解决问题的办法

也许有人能给我一个好建议


多谢各位

如果您可以切换到JPA 2.1,我强烈建议您这样做,您只需执行以下操作:

    StoredProcedureQuery storedProcedure = em.createStoredProcedureQuery("yourStoredprocedure");
    // set parameters
    storedProcedure.registerStoredProcedureParameter("parameterName", String.class, ParameterMode.IN);
    storedProcedure.setParameter("parameterName", "yourParameter");
    // execute stored procedure        
    storedProcedure.execute();

否则它就有点复杂了,只需简单地遵循即可。

JPA2.0对JPA2.1的存储过程没有明确的支持

一种解决方法是使用本机查询,如{CALL apurarcampanhasbrendes.PROC_APURARCAMPANHA?1、?2、?3、?4、?5、?6、?7},但当过程没有参数时,这不起作用

下面是一个使用Hibernate工作界面的示例实现:

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Types;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.hibernate.Session;
import org.hibernate.jdbc.Work;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class CampanhaBrindesStoredProcedure {

    @PersistenceContext
    private EntityManager entityManager;

    private String mensagem;
    private String geroubrinde;

    @Transactional
    public void apurarCampamha(Long numeroPedido, String codigoFilialNF,
         String cgcEntCGCENT, Long numeroSequencia, String integradora)  {
        try {
            MyStoredProc storedProc = new MyStoredProc(numeroPedido, codigoFilialNF, 
                cgcEntCGCENT, numeroSequencia, integradora);
            entityManager.unwrap(Session.class).doWork(storedProc);
            setGeroubrinde(storedProc.getGeroubrinde());
            setMensagem(storedProc.getMensagem());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public String getGeroubrinde() {
        return geroubrinde;
    }

    public void setGeroubrinde(String geroubrinde) {
        this.geroubrinde = geroubrinde;
    }

    public String getMensagem() {
        return mensagem;
    }

    public void setMensagem(String mensagem) {
        this.mensagem = mensagem;
    }

    private static final class MyStoredProc implements Work {

        private final Long numeroPedido;
        private final String codigoFilialNF;
        private final String cgcEntCGCENT;
        private final Long numeroSequencia;
        private final String integradora;
        private String mensagem;
        private String geroubrinde;

        private MyStoredProc(Long numeroPedido, String codigoFilialNF, 
                String cgcEntCGCENT, Long numeroSequencia, String integradora) {
            this.numeroPedido = numeroPedido;
            this.codigoFilialNF = codigoFilialNF;
            this.cgcEntCGCENT = cgcEntCGCENT;
            this.numeroSequencia = numeroSequencia;
            this.integradora = integradora;
        }

        @Override
        public void execute(Connection conn) throws SQLException {
            try (CallableStatement stmt = conn
                    .prepareCall("{CALL APURARCAMPANHASBRINDES.PROC_APURARCAMPANHA(?1, ?2, ?3,  ?4, ?5, ?6, ?7)}")) {
                stmt.setLong(1, numeroPedido);
                stmt.setString(2, codigoFilialNF);
                stmt.setString(3, cgcEntCGCENT);
                stmt.setLong(4, numeroSequencia);
                stmt.setString(5, integradora);
                stmt.registerOutParameter(6, Types.VARCHAR);
                stmt.registerOutParameter(7, Types.VARCHAR);
                stmt.executeUpdate();
                mensagem = stmt.getString(6);
                geroubrinde = stmt.getString(7);
                if (stmt.wasNull()) {
                    geroubrinde = null;
                    mensagem = null;
                }
            }
        }

        public String getMensagem() {
            return mensagem;
        }

        public String getGeroubrinde() {
            return geroubrinde;
        }
    }
}

非常感谢,然后我必须看看如何集成JPA2.1。试着用老办法,我也不是很熟悉。因为,我不太习惯JPA。有了JPA 2.1,我已经很难找到如何将它添加到我的项目中。奇怪的是,在将hibernate-JPA-2.1-api-1.0.0.final.jar添加到我的项目中并将StoredProcedureRequesty复制到我的代码中之后,我的entitymanager em没有任何CreateStoreProcedureRequesty的参考——也许,如果您使用Hibernate作为JPA提供程序(自4.3版JPA 2.1可用以来),那么这是另一回事吗?@user3003944。谢谢大家!我能够解决我的问题。我有两次使用一个API,所以weblogic总是使用旧版本。