将本机查询结果转换为POJO:布尔字段错误



我有一个必须运行本机查询的用例。我能够成功地运行它,但当我试图将结果集转换为dto时,我在布尔字段上遇到了错误。由于我使用的是MySQL,所以布尔值列在数据库中为bit(1(。

这是包装的代码

public interface DownloadDetails {
Boolean getBooleanField();  //Doesnot work but why?
Integer getBooleanFieldAsInt(); //Works but needs explicit check to boolean in code 
Long getLongField();
}

本机查询:

@Query(nativeQuery = true, value = CUSTOM_QUERY)
List<DownloadDetails> getDownloadDetails();

现在,当我尝试做类似downloadDetails.getBooleanField()的事情时,它不起作用,并给出错误

投影类型必须是接口!

我这里缺少什么?

作为一种变通方法,我做了类似于的事情

public interface DownloadDetails {
String getBooleanFieldAsString();
Long getLongField();
default Boolean getBooleanFieldAsBoolean(){
return BooleanUtils.toBoolean(getBooleanFieldAsString());
} 

}

这是我能想到的最好、最整洁的解决方法。此外,如果您想使用此接口直接发回响应(您可能会考虑避免(,请使用@JsonIgnore@JsonProperty("customName")

不确定为什么需要本机查询,但也许可以使用Blaze Persistence实体视图。

我创建了这个库,以便在JPA模型和自定义接口或抽象类定义模型之间进行简单的映射,比如类固醇上的Spring Data Projections。其思想是,您可以按照自己喜欢的方式定义目标结构(域模型(,并通过JPQL表达式将属性(getter(映射到实体模型。

使用Blaze Persistence实体视图,用例的DTO模型可能如下所示:

@EntityView(DownloadEntity.class)
public interface DownloadDetails {
@IdMapping
Long getId();
@Mapping("CAST_BOOLEAN(booleanStringAttribute)")
String getBoolean();
Long getLongField();
}

查询是将实体视图应用于查询的问题,最简单的是按id进行查询。

DownloadDetails a = entityViewManager.find(entityManager, DownloadDetails.class, id);

Spring Data集成使您可以像使用Spring Data Projections一样使用它:https://persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#spring-数据特征

Page<DownloadDetails> findAll(Pageable pageable);

最棒的是,它只会获取实际需要的状态!

最新更新