我有一个必须运行本机查询的用例。我能够成功地运行它,但当我试图将结果集转换为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);
最棒的是,它只会获取实际需要的状态!