You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Hibernate解析REFCURSOR返回类型为null,抛出Invalid column type:2012求助

解决Spring Data JPA调用Oracle REF_CURSOR存储过程的问题

针对你遇到的"invalid column type :2012"错误以及返回null的问题,结合Hibernate 5 + Oracle 12c的环境,我整理了几个关键的解决方向:

1. 修正@StoredProcedureParameter的type属性

你当前用void.class作为REF_CURSOR参数的类型是错误的,Hibernate无法正确识别这个类型和Oracle的SYS_REFCURSOR对应。需要将type改为java.sql.ResultSet.class:

@NamedStoredProcedureQueries({ 
    @NamedStoredProcedureQuery( 
        name = "findPersons", 
        procedureName = "FIND_PERSONS", 
        resultClasses = Person.class, 
        parameters = { 
            @StoredProcedureParameter( 
                name = "P_RETURN", 
                mode = ParameterMode.REF_CURSOR, 
                type = ResultSet.class) 
        } 
    ) 
}) 
@Entity 
public class Person { 
    // 实体字段保持不变
    @Id 
    @GeneratedValue 
    private Long id; 
    @Column 
    private String name; 
}

2. 确保Hibernate方言配置正确

Oracle 12.2.0.1需要使用对应的Hibernate方言,否则可能无法正确解析REF_CURSOR类型。在application.properties(或yml)中添加:

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.Oracle12cDialect

3. 仓库接口的@Procedure注解优化

为了确保仓库方法和命名存储过程正确绑定,建议在@Procedure中明确指定存储过程的关联名称:

public interface PersonRepository extends CrudRepository<Person, Serializable> { 
    @Procedure(name = "findPersons") // 这里的name对应@NamedStoredProcedureQuery的name属性
    List<Person> findPersons(); 
}

4. 备选方案:使用@NamedNativeQuery调用存储过程

如果上述方式仍然有问题,可以尝试用原生查询的方式调用存储过程,这种方式在Hibernate中对REF_CURSOR的支持更直接:

@NamedNativeQueries({
    @NamedNativeQuery(
        name = "Person.findPersons",
        query = "{call FIND_PERSONS(?)}",
        resultClass = Person.class,
        hints = {
            @QueryHint(name = org.hibernate.annotations.QueryHints.CALLABLE, value = "true")
        }
    )
})
@Entity
public class Person {
    // 实体字段不变
}

然后仓库接口改为:

public interface PersonRepository extends CrudRepository<Person, Serializable> { 
    @Query(name = "Person.findPersons", nativeQuery = true)
    List<Person> findPersons(); 
}

5. 检查存储过程定义

确保你的Oracle存储过程确实定义了OUT类型的SYS_REFCURSOR参数,并且查询的字段和Person实体的字段完全匹配(包括名称和类型),示例存储过程定义:

CREATE OR REPLACE PROCEDURE FIND_PERSONS(P_RETURN OUT SYS_REFCURSOR)
AS
BEGIN
    OPEN P_RETURN FOR SELECT id, name FROM PERSON; -- 确保表名、字段名和实体一致
END;
/

这些步骤应该能解决你遇到的"invalid column type"错误和返回null的问题,核心是让Hibernate正确识别Oracle的REF_CURSOR类型,并和实体映射关联起来。

内容的提问来源于stack exchange,提问作者DBreaker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 12:17:28