SpringBoot 3(数据)关键字 isTrue 不起作用

Ale*_*oig 5 java mysql spring-data-jpa spring-boot

将我的应用程序从 SpringBoot 2 升级到 SpringBoot 3 后,我看到了一些奇怪的情况。

该应用程序依赖于现有数据库(MySQL),但该数据库没有采用良好的实践。其中之一用于Y N存储在 VARCHAR 中的布尔值。

为了使 Java 方面的事情变得更容易,我创建了一个如下所示的转换器:

@Converter
public class BooleanToStringConverter implements AttributeConverter<Boolean, String> {

    @Override
    public String convertToDatabaseColumn(Boolean attribute) {
        if (attribute == null) {
            return null;
        }
        return attribute ? "Y" : "N";
    }

    @Override
    public Boolean convertToEntityAttribute(String dbData) {
        if (dbData == null) {
            return null;
        }
        return dbData.equals("Y");
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的豆子上我用它作为:

@Column(name = "DELIVERED")
@Convert(converter = BooleanToStringConverter.class)
private Boolean delivered;
Run Code Online (Sandbox Code Playgroud)

到目前为止,一切都很好。

如果我创建一个存储库来查询所有交付的实体,我会在 SpringBoot 2 中编写如下内容:

List<MyClass> findAllByDeliveredIsTrue();
Run Code Online (Sandbox Code Playgroud)

但如果我在 SpringBoot 3 中运行它,它会返回一个空列表。

我需要手动编写查询才能使其工作。

@Query("SELECT c FROM MyClass c WHERE c.delivered = true")
List<MyClass> findAllByDeliveredIsTrue();
Run Code Online (Sandbox Code Playgroud)

知道为什么会这样吗?


编辑:

我已启用 SQL 日志,并且肯定会以不同的方式创建查询。为了简单起见,我翻译了帖子中的一些内容,因为在实际场景中,数据库是西班牙语,并且它使用S/N而不是Y/ N

List<MyClass> findAllByDeliveredIsTrue();
Run Code Online (Sandbox Code Playgroud)
@Query("SELECT c FROM MyClass c WHERE c.delivered = true")
List<MyClass> findAllByDeliveredIsTrue();
Run Code Online (Sandbox Code Playgroud)
2023-05-13T10:23:19.336+02:00 ERROR 42936 --- [  restartedMain] c.n.a.backend.service.CondicioService    : DEBUG INIT
Hibernate: select c1_0.COND_CONDICIO,c1_0.COND_ACTIU,c1_0.COND_DATA,c1_0.COND_DESCRIPCIO from CONDICIONS c1_0 where c1_0.COND_ACTIU order by c1_0.COND_DATA desc limit ?
Hibernate: select c1_0.COND_CONDICIO,c1_0.COND_ACTIU,c1_0.COND_DATA,c1_0.COND_DESCRIPCIO from CONDICIONS c1_0 where c1_0.COND_ACTIU='S' order by c1_0.COND_DATA asc
2023-05-13T10:23:19.451+02:00 ERROR 42936 --- [  restartedMain] c.n.a.backend.service.CondicioService    : DEBUG END
Run Code Online (Sandbox Code Playgroud)

Ale*_*oig 0

事实证明这是 Spring Data 上 CriteriaBuilder 的问题。该问题正在存储库问题 #2800上进行跟踪。在回答时,它仍然没有解决,受影响的版本至少是Spring Boot 3.0.2