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

Posted

技术标签:

【中文标题】spring-data-jpa 1.11.16 带游标的存储过程【英文标题】:spring-data-jpa 1.11.16 stored procedure with cursor 【发布时间】:2019-05-12 10:19:24 【问题描述】:

我无法在 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 : call 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 警告 24164 --- [nio-9090-exec-2] .m.m.a.ExceptionHandlerExceptionResolver :已解决 [java.lang.UnsupportedOperationException: org.hibernate.dialect.Oracle9iDialect 不支持结果集 存储过程]

我不确定是否可以在这个旧版本的 spring-data 中使用 cursor。我该怎么做才能使用 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】:

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

仔细检查错误信息:

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

该错误表示 Hibernate 使用的 Oracle9 方言不支持从存储过程中读取数据。所以,问题的根源是 Hibernate,而不是 Spring Data。

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

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

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

【讨论】:

添加 5.3.7.Final versione 的 hibernate-core,我可以将最后一个版本集成到我的 Oracle 方言项目中吗?实际上我正在使用: ojdbc712.1.0.2 当您更改 application.properties 文件时,您似乎已经升级了 Oracle 10 的方言。 是的,我在发表评论后创建了答案 :) 我提出了另一个问题,如果你能帮助我,那就太好了。 ***.com/questions/53727000/…谢谢

以上是关于spring-data-jpa 1.11.16 带游标的存储过程的主要内容,如果未能解决你的问题,请参考以下文章

spring-data-jpa

spring-data-jpa快速入门——

Spring-data-jpa:批量插入不起作用

Spring-data-jpa详解

Spring-data-jpa 学习笔记

Spring-data-jpa + Hibernate 未创建预期表