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
相关产品推荐
相关产品推荐

