正确的表达式不是 JPQL/HQL 查询中的有效表达式

Posted

技术标签:

【中文标题】正确的表达式不是 JPQL/HQL 查询中的有效表达式【英文标题】:The right expression is not a valid expression in the JPQL/HQL query 【发布时间】:2021-04-05 15:12:32 【问题描述】:

我不明白为什么我的 JPQL 表达式有误。我想获取未从我的数据库中删除并且目前正在租用的自行车的列表。你能帮帮我吗?

@Data
@MappedSuperclass
public abstract class AbstractEntity implements Serializable 

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Basic(optional = false)
    @Column(nullable = false)
    private boolean isRemoved;


@Data
@Entity
@NamedQueries(
        @NamedQuery(name = "Bike.findRent", query = "SELECT b FROM Bike b WHERE NOT b.isRemoved AND b.isRent")
)
public class Bike extends AbstractEntity 

    @Basic(optional = false)
    @Column(nullable = false)
    private boolean isRent;


@Repository
public class BikeDao extends BaseDao<Bike> 

    public BikeDao() 
        super(Bike.class);
    

    public List<Bike> findRent() 
        return em.createNamedQuery("Bike.findRent", Bike.class).getResultList();
    

在我运行我的 Spring 应用程序并通过 Postman 尝试发布 Bike 数据之后。但是,

Caused by: org.eclipse.persistence.exceptions.EntityManagerSetupException: 
Exception Description: Deployment of PersistenceUnit [default] failed. Close all factories for this PersistenceUnit.
Internal Exception: Exception [EclipseLink-0] (Eclipse Persistence Services - 2.7.7.v20200504-69f2c2b80d): org.eclipse.persistence.exceptions.JPQLException
Exception Description: Syntax error parsing [SELECT b FROM Bike b WHERE NOT b.isRemoved AND b.isRent]. 
[47, 55] The right expression is not a valid expression.

这是什么意思?我无法找出问题所在。

【问题讨论】:

【参考方案1】:

根据 JPA 规范(4.5 WHERE 子句):

WHERE 子句定义如下:

where_clause ::= WHERE conditional_expression

在conditional expression 中,您只能使用可用的简单表达式的组合,例如比较、之间、中、类似、空比较(也称为空)、空集合、集合成员、存在表达式。

因此,您应该通过以下方式更正您的查询:

SELECT b FROM Bike b WHERE b.isRemoved = false AND b.isRent = true

【讨论】:

以上是关于正确的表达式不是 JPQL/HQL 查询中的有效表达式的主要内容,如果未能解决你的问题,请参考以下文章

Atitit oodbms的查询,面向对象的sql查询jpa jpql hql

如何在 IntelliJ 12 中启用 HQL/JPQL 自动完成

使用 JPQL/HQL 在 JPA 中订购连接获取的集合

Hibernate JPQL/HQL:聚合函数的错误显示错误的表/实体连接两次(仅使用 HSQLDB)的结果?

SQL 表表达式

查询表达式中的语法错误(缺少运算符)“