我需要知道是否有可能将我的JQPL查询结果转换为DTO。
查询结果是一个像这样的数组的数组:Json:
[
[
ModuleID: number,
ModuleName: string,
ToolId: number,
ToolName: string,
Enabled: boolean
],
]
而且我想转换成此DTO:
public class ModuleDTO {
private Long ModuleID;
private String ModuleName;
private List<ToolsDTO> Tools;
}
public class ToolsDTO {
private Long ToolId;
private String ToolName;
private Boolean Enabled;
}
您会看到最后三个是模块的子代,这意味着在搜索中可能会有重复的模块,但是所有子代必须在同一列表中。
这是Blaze-Persistence Entity Views的完美用例。
Blaze-Persitence是JPA之上的查询生成器,它支持JPA模型之上的许多高级DBMS功能。我在其顶部创建了实体视图,以方便在JPA模型和自定义接口定义的模型之间进行映射,例如类固醇上的Spring Data Projections。想法是您以自己喜欢的方式定义目标结构,并通过JPQL表达式将属性(获取器)映射到实体模型。由于属性名称用作默认映射,因此大多数情况下不需要显式映射,因为80%的用例都是将DTO作为实体模型的子集。
您没有指定实体模型,所以在这里我要假设一些事情。映射看起来可能像下面这样简单
@EntityView(Module.class)
interface ModuleDTO {
@IdMapping
Long getModuleId();
String getModuleName();
List<ToolsDTO> getTools();
}
@EntityView(Tools.class)
interface ToolsDTO {
@IdMapping
Long getToolId();
String getToolName();
Boolean getEnabled();
}
查询是将实体视图应用于查询的问题,最简单的方法就是按ID查询。
ModuleDTO dto = entityViewManager.find(entityManager, ModuleDTO.class, id);
但是,Spring Data集成使您可以像使用Spring Data Projections一样使用它:https://persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#spring-data-features
它只会获取您告诉它要获取的映射