如何将JQPL查询转换为DTO?

问题描述 投票:0回答:1

我需要知道是否有可能将我的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; 

}

您会看到最后三个是模块的子代,这意味着在搜索中可能会有重复的模块,但是所有子代必须在同一列表中。

java hibernate jpa jpql java-ee-8
1个回答
0
投票

这是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

它只会获取您告诉它要获取的映射

© www.soinside.com 2019 - 2024. All rights reserved.