无法使用 Hibernate 和 Oracle 11g 数据库读取 Spring Boot 应用程序中的第二个 Refcursor
Posted
技术标签:
【中文标题】无法使用 Hibernate 和 Oracle 11g 数据库读取 Spring Boot 应用程序中的第二个 Refcursor【英文标题】:Unable to Read 2nd Refcursor in a Spring Boot application with Hibernate and Oracle 11g Database 【发布时间】:2020-06-17 18:14:28 【问题描述】:问题详情
我们正在开发一个 Spring Boot 应用程序,其中我们使用 Oracle 11g DB 的 @NamedStoredProcedureQuery
连接到 Stored Procs(所有返回多个 refcursor)。我们无法同时从第二个游标读取数据。一旦我们为第二个 refcursor 提供了第二个结果类,我们就会得到一个名为 Invalid Column Name
的异常。读取 1 个光标工作正常。
异常详情
javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException:
Error extracting results from CallableStatement Caused by:
java.sql.SQLException: Invalid column name
实现细节
存储过程查询@NamedStoredProcedureQuery (
name = "getSP1Data",
procedureName = "package_name",
resultClasses = Cursor1Response.class, Cursor2Response.class,
parameters =
@StoredProcedureParameter(type = Integer.class, mode = ParameterMode.IN, name = "in_param_1"),
@StoredProcedureParameter(type = void.class, mode = ParameterMode.REF_CURSOR, name = "cursor_1"),
@StoredProcedureParameter(type = void.class, mode = ParameterMode.REF_CURSOR, name = "curosr_2"),
@StoredProcedureParameter(type = String.class, mode = ParameterMode.INOUT, name = "in_out_param_2")
)
光标响应类
@Entity
public class Cursor1Response
@Id
@Column(name = "column_name_1")
private Date column1;
@Column(name = "column_name_2")
private Double column2;
@Entity
public class Cursor2Response
@Id
@Column(name = "column_name_1")
private Date column1;
@Column(name = "column_name_2")
private Double column2;
DAO 层实现(从我们实际调用存储过程查询的位置)
StoredProcedureQuery query = entityManager.createNamedStoredProcedureQuery("getSP1Data");
// Code for setting all in params
query.getResultList(); // While execution of this line it is
throwing the above mentioned exception
有没有人处理过这种情况并且对如何解决这个异常有任何想法?
【问题讨论】:
【参考方案1】:我遇到了同样的问题。首先,我尝试将 Oracle JDBC 驱动程序从 8
降级到 6
,但没有任何结果。之后我用更编程的存储过程定义更改了注释(注意:避免使用位置参数,它们会导致同样的问题......):
EntityManager entityManager = Persistence.createEntityManagerFactory("namehere").createEntityManager();
StoredProcedureQuery spq =
entityManager.createStoredProcedureQuery("YOUR.SP.NAME")
.registerStoredProcedureParameter("name1", String.class, ParameterMode.IN)
.registerStoredProcedureParameter("name2", Integer.class, ParameterMode.OUT)
.registerStoredProcedureParameter("name3", String.class, ParameterMode.OUT)
.registerStoredProcedureParameter("name4", void.class,ParameterMode.REF_CURSOR)
.setParameter(SP_PARAM_MSISDN, "paramval");
spq.execute();
【讨论】:
以上是关于无法使用 Hibernate 和 Oracle 11g 数据库读取 Spring Boot 应用程序中的第二个 Refcursor的主要内容,如果未能解决你的问题,请参考以下文章
无法从实体类 Hibernate 4.2.7 Websphere 8.5.5 oracle 11g 创建表
如何使用 Hibernate 在 Oracle 中保留 LARGE BLOB (>100MB)