Hibernate中IS TRUE与= TRUE的差异及升级报错问题
IS TRUE查询报错的原因解析 Hibernate版本升级后,原本正常运行的JPQL查询抛出语义异常,报错信息如下:
org.hibernate.query.SemanticException: A query exception occurred [SELECT count(c) FROM Client c WHERE c.tmp_batch IS TRUE]
line 1:65 no viable alternative at input 'SELECTcount(c)FROMClientcWHEREc.tmp_batchISTRUE'
原查询代码:
public Long getClientCount() { return getEntityManager().createQuery("SELECT count(c) FROM Client c WHERE c.tmp_batch IS TRUE", Long.class) .getResultList() .get(0); }
经测试,将IS TRUE替换为= TRUE后查询恢复正常,修改后的代码:
public Long getClientCount() { return getEntityManager().createQuery("SELECT count(c) FROM Client c WHERE c.tmp_batch = TRUE", Long.class) .getResultList() .get(0); }
关联的Client实体类代码:
@Entity @Table(name = "CLIENTS") @IdClass(ClientId.class) public class Client { @Id @Column(name = "TMP_BATCH") private boolean tmp_batch; ... public boolean isTmp_batch() { return this.tmp_batch; } public void setTmp_batch(boolean tmp_batch) { this.tmp_batch = tmp_batch; } ... }
核心差异与报错原因
JPQL规范的严格遵循
旧版本Hibernate对JPQL语法校验较宽松,允许针对基本类型boolean使用IS TRUE语法。但新版本严格遵循JPQL规范:IS TRUE/FALSE仅适用于包装类型Boolean的实体属性(这类属性可能为null);而基本类型boolean不存在null值,规范要求使用= TRUE/FALSE进行比较。基本类型与包装类型的语法适配
你的实体类中tmp_batch是基本类型boolean,并非可空的Boolean。IS系列语法是为处理null场景设计的,不适用于非空的基本类型字段,新版本Hibernate的语义解析器会判定该语法不符合规范,直接抛出异常。解析器校验逻辑升级
新版本Hibernate的JPQL解析器增强了语法合规性校验,对不符合规范的语法直接拦截报错,而旧版本可能会自动兼容或忽略这类语法差异。
内容的提问来源于stack exchange,提问作者Xiidref

