You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 23:32:57