SpringBoot 3/Hibernate 6迁移后Boolean与String转换异常求助
解决SpringBoot3+Hibernate6中Boolean转Y/N查询不转换的问题
问题原因
Hibernate 6对属性转换器的处理逻辑发生了变化:默认情况下@Convert注解仅负责实体的持久化和加载阶段的字段转换,不会自动应用到JPQL/CriteriaQuery的查询条件中,导致查询时直接把Boolean值(如false)写入SQL,触发Oracle的ORA-00904错误。
解决方案
方案1:改用Hibernate内置@Type注解(推荐)
替换原来的@Convert为@Type(YesNoBooleanType.class),这个内置类型会同时处理实体读写和查询条件的转换:
@Entity @Table(name = "ENTITY_WITH_CONVERTED_FIELD") public class EntityWithConvertedField { @Id @Column(name = "ID") private Long id; @Column(name = "MY_FLAG") @Type(YesNoBooleanType.class) // 替代@Convert注解 private Boolean myFlag; }
修改后,Hibernate会自动将查询中的Boolean.TRUE/Boolean.FALSE转换为'Y'/'N',生成正确的SQL。
方案2:全局配置所有Boolean字段的转换规则
如果项目中有多个类似的Boolean转Y/N的字段,可以通过全局配置统一处理,无需逐个字段加注解:
在application.properties中添加:
# 指定Boolean类型的JDBC类型为VARCHAR spring.jpa.properties.hibernate.type.preferred_boolean_jdbc_type=VARCHAR # 默认使用yes_no类型转换(Y/N对应Boolean) spring.jpa.properties.hibernate.type.default_for_boolean_type=yes_no
方案3:手动处理查询条件(不推荐,繁琐)
如果坚持使用@Convert,需要在CriteriaQuery或JPQL中手动将Boolean值转换为对应的字符串:
// CriteriaQuery示例 CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery<EntityWithConvertedField> query = cb.createQuery(EntityWithConvertedField.class); Root<EntityWithConvertedField> root = query.from(EntityWithConvertedField.class); // 手动将Boolean值转为'Y'/'N' Predicate flagPredicate = cb.equal(root.get("myFlag"), Boolean.TRUE ? "Y" : "N"); Predicate idPredicate = cb.equal(root.get("id"), targetId); query.where(cb.and(flagPredicate, idPredicate)); List<EntityWithConvertedField> result = entityManager.createQuery(query).getResultList();
验证
修改后执行查询,查看生成的SQL语句,确认条件部分从mt1_0.MY_FLAG = false变为mt1_0.MY_FLAG = 'N'(或对应的值),即可解决该异常。
内容的提问来源于stack exchange,提问作者Bartłomiej Adamczyk
相关产品推荐
相关产品推荐

