在JPA2.0中执行存储过程
我有以下问题,我不知道如何解决它。 在我的MSSQL Server 2008上,我有一个存储过程,其中一个参数是日期,格式为:yyyy-MM-dd。 然后我有一个@Entity类,它带有一个@NamedNativeRequesty:在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) @
@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总是使用旧版本。