SpringBoot 3中JPA Repository的isTrue查询失效问题求助
SpringBoot3升级后JPA方法名查询布尔转换器失效问题解决
问题根源
SpringBoot3对应的Hibernate 6.x版本,默认不再自动将自定义AttributeConverter应用到方法名生成的查询条件中,而SpringBoot2搭配的Hibernate5是默认启用该逻辑的,这就导致自动生成的SQL缺失布尔值对应的字符串转换(比如本该生成COND_ACTIU='S',结果只输出COND_ACTIU)。
解决方案
1. 确保自定义转换器正确实现
检查你的BooleanToStringConverter,保证泛型和方法逻辑准确,建议添加@Converter(autoApply = true)让转换器全局生效(也可以在实体字段单独标注@Convert):
import jakarta.persistence.AttributeConverter; import jakarta.persistence.Converter; @Converter(autoApply = true) public class BooleanToStringConverter implements AttributeConverter<Boolean, String> { @Override public String convertToDatabaseColumn(Boolean attribute) { // 对应数据库的'S'表示true,'N'表示false return Boolean.TRUE.equals(attribute) ? "S" : "N"; } @Override public Boolean convertToEntityAttribute(String dbData) { return "S".equals(dbData); } }
注意:SpringBoot3使用
jakarta.persistence包,而非SpringBoot2的javax.persistence,如果之前转换器用的是旧包,需要替换为新包。
2. 开启Hibernate查询转换器自动应用
在配置文件(application.properties或application.yml)中添加Hibernate配置,强制让查询条件自动使用转换器:
- application.properties:
spring.jpa.properties.hibernate.query.converter.auto_apply=true
- application.yml:
spring: jpa: properties: hibernate: query: converter: auto_apply: true
3. 验证实体字段注解(可选)
如果没有使用@Converter(autoApply = true),要确保实体类的布尔字段上正确标注@Convert:
import jakarta.persistence.Column; import jakarta.persistence.Convert; import jakarta.persistence.Entity; @Entity public class YourEntity { // ...其他字段 @Column(name = "COND_ACTIU") @Convert(converter = BooleanToStringConverter.class) private Boolean delivered; // getter/setter }
验证
配置完成后重启应用,调用findAllByDeliveredIsTrue(),查看SQL日志,应该会生成where c1_0.COND_ACTIU='S'的正确条件,查询结果恢复正常。
内容的提问来源于stack exchange,提问作者Alex Roig
相关产品推荐
相关产品推荐

