由于意外的 AST 节点,使用 JPA TREAT 的命名查询无法正常工作

Posted

技术标签:

【中文标题】由于意外的 AST 节点,使用 JPA TREAT 的命名查询无法正常工作【英文标题】:Named query with JPA TREAT is not working due to unexpected AST node 【发布时间】:2019-09-20 21:48:14 【问题描述】:

我正在尝试创建一个给出错误的命名查询。

" SELECT p FROM Project p  " +
" JOIN FETCH p.employees e " +
" WHERE p.id=:id AND ( TREAT(e AS FullTimeEmployee).code = :code OR e.state=:state)"

项目类

public class Project 
    @Id
    @GeneratedValue
    private long id;
    private String code;
    @OneToMany(cascade = CascadeType.ALL)
    private List<Employee> employees;

现在 Employee 类已被多个类扩展。命名查询的目标是获取一个具有特定状态的过滤员工或具有特定代码的 FullTimeEmployee 的项目。

错误:

<May 2, 2019 12:22:21,205 PM CEST> <Error> <org.hibernate.hql.internal.ast.ErrorCounter> <BEA-000000> <<AST>:1:127: unexpected AST node: (
<AST>:1:127: unexpected AST node: (
        at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.addrExpr(HqlSqlBaseWalker.java:4936)
        at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.addrExprLhs(HqlSqlBaseWalker.java:5370)
        at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.addrExpr(HqlSqlBaseWalker.java:4831)
        at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.expr(HqlSqlBaseWalker.java:1263)
        at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.exprOrSubquery(HqlSqlBaseWalker.java:4552)
        Truncated. see log file for complete stacktrace

【问题讨论】:

HQL unexpected AST node: :的可能重复 @SudhirOjha 它与建议的不一样,这是完全不同的错误。 您使用的是什么版本的 JPA 和 Hibernate? @SimonMartinelli hibernate 版本是 4.2.12.Final 和 hibernate-jpa-2.0-api:1.0.1.Final 【参考方案1】:

TREAT 函数是在 JPA 2.1 中引入的。

Hibernate 从 4.3 或 5.0 版开始支持 JPA 2.1。

因此,为了使用 TREAT,您必须更新 Hibernate。

【讨论】:

是否有任何替代方案可以用于当前依赖项,因为在项目升级中这将需要太多测试。 当我正确解释您的查询时,您只对 FullTimeEmployee 感兴趣,对吧?如果是,请从 FullTimeEmployee 中选择 ... 不,我对所有 state = active 的员工和所有拥有 code = "INT" 的 FullTimeEmployee 感兴趣,即使他们的 state 不活跃 您可以使用 UNION 创建查询

以上是关于由于意外的 AST 节点,使用 JPA TREAT 的命名查询无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

JPQL 意外 AST 节点:围绕“coalesce”

HQL 意外 AST 节点:vector

from 子句中的 JPA/hibernate 子查询

在 WHERE 中使用“CASE WHEN”语句进行查询会导致 QuerySyntaxException:意外 AST

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

org.hibernate.hql.internal.ast.QuerySyntaxException:意外令牌:FROM,当尝试删除与自身连接的表时