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的主要内容,如果未能解决你的问题,请参考以下文章