![](/img/trans.png)
[英]Hibernate Native Query bad Performance and struggling to convert to JQPL
[英]How to Convert a JQPL Query into a DTO?
我需要知道是否可以將我的 JQPL 查詢結果轉換為 DTO。
查詢結果是一個 Arrays 數組,如 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 model 之上的許多高級 DBMS 功能。 我在它上面創建了實體視圖,以便在 JPA 模型和自定義接口定義模型之間輕松映射,例如 Spring 數據投影。 這個想法是您以您喜歡的方式定義您的目標結構,並通過 JPQL 表達式將 map 屬性(getter)定義到實體 model。 由於屬性名稱用作默認映射,因此您通常不需要顯式映射,因為 80% 的用例是擁有作為實體 model 子集的 DTO。
您沒有指定實體 model 所以我將在這里假設一些事情。 映射可能看起來像下面這樣簡單
@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 數據集成允許您幾乎像 Spring 數據投影一樣使用它: https://persistence.blazebit.com/documentation/entity-view/mandata-features_html/index。
它只會獲取您告訴它獲取的映射
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.