【问题标题】:org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: FETCHorg.hibernate.hql.internal.ast.QuerySyntaxException:意外令牌:FETCH
【发布时间】:2020-03-13 21:13:03
【问题描述】:

我正在将一个使用 DB2 数据库的应用程序从 Spring(IBM Websphere) 迁移到 Springboot(Embedded Tomcat)。

使用休眠 4.1.9.Final 的现有应用程序使用此 FETCH 查询完美运行:

@Query(
"SELECT ssss FROM SSSSPackageDiscountLoad ssss, SSSBasicLoad ttt WHERE ssss.schemeId = ttt.id AND ttt.code = :schemeCode AND "
+ "ssss.ruleCode = :ruleCode ORDER BY ssss.effDate DESC FETCH FIRST 1 ROWS ONLY")

迁移的 springboot(version 2.1.7.RELEASE) 应用使用休眠 5.3.10.Final

启动应用程序给了我这个问题:

引起:org.hibernate.hql.internal.ast.QuerySyntaxException: 意外标记:FETCH 靠近第 1 行,第 255 列

【问题讨论】:

    标签: java spring-boot spring-data-jpa db2


    【解决方案1】:

    来自另一个帖子:unexpected token: LIMIT

    基本上你的查询应该是原生的:

    `@Query(
    "SELECT ssss FROM SSSSPackageDiscountLoad ssss, SSSBasicLoad ttt WHERE ssss.schemeId = ttt.id AND ttt.code = :schemeCode AND "
    + "ssss.ruleCode = :ruleCode ORDER BY ssss.effDate DESC FETCH FIRST 1 ROWS ONLY", nativeQuery = true)`
    

    注意最后的nativeQuery。 默认情况下,nativeQuery 为 false。

    【讨论】:

      【解决方案2】:

      你可以使用等价的语句:

      @Query(
      "SELECT ssss FROM SSSSPackageDiscountLoad ssss, SSSBasicLoad ttt WHERE ssss.schemeId = ttt.id AND ttt.code = :schemeCode AND "
      + "ssss.ruleCode = :ruleCode ORDER BY ssss.effDate DESC LIMIT 1")
      

      但是,如果您想按原样使用查询,则需要按照here 的建议强制使用方言。

      在你的情况下,这应该有效:

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

      【讨论】:

        猜你喜欢
        • 2016-06-08
        • 2020-09-05
        • 2021-08-20
        • 2015-07-12
        • 1970-01-01
        • 2016-02-21
        • 2018-11-16
        • 2018-10-09
        • 1970-01-01
        相关资源
        最近更新 更多