spring-data-jpa 1.11.16带游标的存储过程

时间:2018-12-11 12:09:46

标签: java sql-server spring-data-jpa cursor

我无法在spring-data-jpa(版本1.11.16)和oracle服务器中使用带有游标的存储过程。

存储库:

@Repository
public interface GeoRegionRepository extends CrudRepository<PocRegions, String> {

    @Procedure(name = "PocRegions.getRegion", procedureName = "POC_PKG_GEO.PRO_RETURN_REGION")
    List<PocRegions> getRegion(@Param("id_region") BigDecimal regionId);
}

实体上的注释:

@Entity
@Table(name = "POC_REGIONS")
@NamedStoredProcedureQueries({
        @NamedStoredProcedureQuery( name = "PocRegions.getRegion", procedureName = "POC_PKG_GEO.PRO_RETURN_REGION",
                resultClasses = PocRegions.class ,parameters = {
                @StoredProcedureParameter(mode = ParameterMode.IN, name = "id_region", type = BigDecimal.class),
                @StoredProcedureParameter(mode = ParameterMode.REF_CURSOR, name = "o_cursor", type = Void.class)})
})

那是我调用时的java响应:

geoRegionRepo.getRegion(id)

  

2018-12-11 13:07:26.047调试24164 --- [nio-9090-exec-2]   org.hibernate.SQL:       {呼叫POC_PKG_GEO.PRO_RETURN_REGION(?,?)}休眠:       {call POC_PKG_GEO.PRO_RETURN_REGION(?,?)} 2018-12-11 13:07:27.410 TRACE 24164 --- [nio-9090-exec-2] o.h.type.descriptor.sql.BasicBinder   :将参数[id_region]绑定为[NUMERIC]-[1] 2018-12-11   13:07:27.658 WARN 24164 --- [nio-9090-exec-2]   .m.m.a.ExceptionHandlerExceptionResolver:已解决   [java.lang.UnsupportedOperationException:   org.hibernate.dialect.Oracle9iDialect不支持通过   存储过程]

我不确定在此旧版本的spring-data中是否可以使用游标。我该怎么做才能使用spring-data-jpa并调用该过程?

谢谢

编辑1:

我将以下行添加到我的application.properties中:

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

并将其添加到pom中(将休眠冲突排除到spring-data-jpa中 依赖项的声明):

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-tools</artifactId>
    <version>${hibernate.version}</version>
</dependency>

1 个答案:

答案 0 :(得分:1)

问题很可能不是spring-data的版本,而是Hibernate的版本和/或配置。

仔细检查错误消息:

  

java.lang.UnsupportedOperationException:org.hibernate.dialect.Oracle9iDialect不支持通过存储过程的结果集

该错误表明Hibernate使用的Oracle9方言不支持从存储过程读取数据。因此,问题的根源是休眠,而不是Spring数据。

如果您尝试使用错误消息进行快速搜索,您将获得以下有用的线索:

java.lang.UnsupportedOperationException: org.hibernate.dialect.Oracle10gDialect does not support resultsets via stored procedures

根据这篇文章,我可能需要将您的休眠版本升级到5.1和方言版本(Oracle 9升级到10)。