org.hibernate.hql.internal.ast.QuerySyntaxException:意外令牌:FETCH

Posted

技术标签:

【中文标题】org.hibernate.hql.internal.ast.QuerySyntaxException:意外令牌:FETCH【英文标题】:org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: 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 列

【问题讨论】:

【参考方案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

【讨论】:

以上是关于org.hibernate.hql.internal.ast.QuerySyntaxException:意外令牌:FETCH的主要内容,如果未能解决你的问题,请参考以下文章