Именованный запрос с JPA TREAT не работает из-за неожиданного узла AST

Я пытаюсь создать именованный запрос, который выдает ошибку.

" 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

person Ashu    schedule 02.05.2019    source источник
comment
Возможный дубликат неожиданного узла AST HQL: :   -  person Sudhir Ojha    schedule 02.05.2019
comment
@SudhirOjha Это не то же самое, что было предложено, это совершенно другая ошибка.   -  person Ashu    schedule 02.05.2019
comment
Какие версии JPA и Hibernate вы используете?   -  person Simon Martinelli    schedule 02.05.2019
comment
Версия спящего режима @SimonMartinelli: 4.2.12.Final и hibernate-jpa-2.0-api:1.0.1.Final.   -  person Ashu    schedule 02.05.2019


Ответы (1)


Функция TREAT была введена в JPA 2.1.

Hibernate поддерживает JPA 2.1, начиная с версии 4.3 или 5.0.

Поэтому, чтобы использовать TREAT, вам нужно обновить Hibernate.

person Simon Martinelli    schedule 02.05.2019
comment
Есть ли какая-либо альтернатива, которую я могу использовать с текущей зависимостью, так как при обновлении проекта это потребует слишком большого тестирования. - person Ashu; 03.05.2019
comment
Когда я правильно интерпретирую ваш запрос, вас интересует только FullTimeEmployee, верно? Если да, просто выберите ... из FullTimeEmployee - person Simon Martinelli; 03.05.2019
comment
нет, меня интересуют все сотрудники, имеющие состояние = активно, и все сотрудники FullTimeEmployee, имеющие код = INT, даже если их состояние не активно - person Ashu; 03.05.2019
comment
Вы можете создать запрос с UNION - person Simon Martinelli; 03.05.2019