使用 JPA 本机查询的 Oracle 分层查询(START WITH、CONNECT BY PRIOR):ORA-00933 SQL 命令未正确结束

发布于 2025-01-14 22:46:56 字数 1961 浏览 2 评论 0原文

Spring boot - Oracle 19 - JPA

我定义了一个简单的分层表,具有父/子关系。

我有以下查询:

SELECT
    tnv.*
FROM
    TBL_NOM_VERSION tnv
WHERE
    tnv.INSTITUTION_ID = ?1 START WITH tnv.PARENT_ID IS NULL CONNECT
BY
    PRIOR tnv.ID = tnv.PARENT_ID
ORDER SIBLINGS BY
    tnv.TREE_LEVEL ASC

注意:查询在 DBeaver 中正常工作,到目前为止有任何问题!

当我尝试在 Spring Boot 应用程序中执行查询时,出现以下错误:

@Query(nativeQuery = true, value = "SELECT * \n" +
        "FROM TBL_NOM_VERSION tnv \n" +
        "WHERE tnv.INSTITUTION_ID = ?1\n" +
        "START WITH tnv.PARENT_ID IS NULL\n" +
        "CONNECT BY PRIOR tnv.ID = tnv.PARENT_ID \n" +
        "ORDER SIBLINGS BY tnv.TREE_LEVEL ASC;")
List<NomVersionView> findAllNomenclatureByInstitution(Long institutionId);

休眠: 选择 * 从 TBL_NOM_VERSION tnv 在哪里 tnv.INSTITUTION_ID = ?从 tnv.PARENT_ID 为 NULL 开始连接 经过 先前的 tnv.ID = tnv.PARENT_ID 兄弟姐妹排序依据 tnv.TREE_LEVEL ASC; org.springframework.dao.InvalidDataAccessResourceUsageException:无法提取结果集; SQL [不适用];嵌套异常是org.hibernate.exception.SQLGrammarException:无法提取ResultSet 在 org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:281) 在 org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:255) 引起原因:java.sql.SQLSyntaxErrorException:ORA-00933:SQL命令未正确结束

application.yml:

spring:
    datasource:
        driver-class-name: oracle.jdbc.OracleDriver
    jpa:
        database-platform: org.hibernate.dialect.Oracle12cDialect

pom.xml

<dependency>
    <groupId>com.oracle.jdbc</groupId>
    <artifactId>ojdbc8</artifactId>
    <version>18.3.0.0</version>
</dependency>

可能是什么原因?是否可以使用Spring Boot Data执行sql原生分层查询? 我做错了什么?

谢谢!

Spring boot - Oracle 19 - JPA

I've defined a simple hierarchical table, with a parent/child relationship.

I have the following query:

SELECT
    tnv.*
FROM
    TBL_NOM_VERSION tnv
WHERE
    tnv.INSTITUTION_ID = ?1 START WITH tnv.PARENT_ID IS NULL CONNECT
BY
    PRIOR tnv.ID = tnv.PARENT_ID
ORDER SIBLINGS BY
    tnv.TREE_LEVEL ASC

NOTE: The query works properly in DBeaver, any problem so far!

When I try to execute the query in my spring boot application, I got the following error:

@Query(nativeQuery = true, value = "SELECT * \n" +
        "FROM TBL_NOM_VERSION tnv \n" +
        "WHERE tnv.INSTITUTION_ID = ?1\n" +
        "START WITH tnv.PARENT_ID IS NULL\n" +
        "CONNECT BY PRIOR tnv.ID = tnv.PARENT_ID \n" +
        "ORDER SIBLINGS BY tnv.TREE_LEVEL ASC;")
List<NomVersionView> findAllNomenclatureByInstitution(Long institutionId);

Hibernate:
SELECT
*
FROM
TBL_NOM_VERSION tnv
WHERE
tnv.INSTITUTION_ID = ? START WITH tnv.PARENT_ID IS NULL CONNECT
BY
PRIOR tnv.ID = tnv.PARENT_ID
ORDER SIBLINGS BY
tnv.TREE_LEVEL ASC;
org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:281)
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:255)
Caused by: java.sql.SQLSyntaxErrorException: ORA-00933: SQL command not properly ended

application.yml:

spring:
    datasource:
        driver-class-name: oracle.jdbc.OracleDriver
    jpa:
        database-platform: org.hibernate.dialect.Oracle12cDialect

pom.xml

<dependency>
    <groupId>com.oracle.jdbc</groupId>
    <artifactId>ojdbc8</artifactId>
    <version>18.3.0.0</version>
</dependency>

What could be the cause? Is it possible to perform sql native hierarchical query using Spring Boot Data?
What am I doing wrong?

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文