无法使用 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的主要内容,如果未能解决你的问题,请参考以下文章

休眠/Oracle 序列不工作

无法从实体类 Hibernate 4.2.7 Websphere 8.5.5 oracle 11g 创建表

如何使用 Hibernate 在 Oracle 中保留 LARGE BLOB (>100MB)

无法确定“oracle”的方言

org.hibernate.HibernateException:无法访问 lob 流

使用 JPA 和 Hibernate 将 Java 布尔值映射到 Oracle Number 列