我遇到了将HQL查询映射到复杂DTO的问题。复杂的DTO我指的是复合另一个DTO /集合DTO的DTO。我试图找到解决方案,但没有找到任何符合我要求的东西。例如,有一个DTO(为简单起见我省略了属性):
public class Consignment {
private List<OrderData> orderData;
private List<AttributesData> attributesData;
private CostData costData;
public Consignment(List<OrderData> orderData, List<AttributesData> attributesData, CostData costData) {
//setting fields
}
}
HQL允许通过构造函数创建DTO对象,方法是将结果集中的列作为参数传递。是否可以创建子查询或smth。是否要在集合中获取数据,然后将其作为主要DTO中的参数传递?看起来这是不可能的,但也许我错过了一些东西。
否则只有这样做的方法是在单独的HQL查询中获取数据,然后将主DTO创建为普通的Java对象。如果有人有其他想法如何做到这一点 - 请分享您的想法。
答案 0 :(得分:0)
您可以在同一个查询中获取其他数据,如下所示:
FROM Consignment cons JOIN FETCH cons.orderData ord
答案 1 :(得分:0)
我正是为此用例创建了Blaze-Persistence Entity Views。您实际上将JPA实体的DTO定义为接口,并将其应用于查询。它支持映射嵌套的DTO,集合等,本质上是您期望的所有内容,此外,它还将提高查询性能,因为它将生成查询,仅提取您实际为DTO所需的数据。
您的实体视图示例看起来像这样
@EntityView(ConsignmentEntity.class)
interface Consignment {
List<OrderData> getOrderData();
List<AttributesData> getAttributesData();
CostData getCostData();
}
@EntityView(OrderDataEntity.class)
interface OrderData {
// attributes of OrderDataEntity that you need
}
@EntityView(AttributesDataEntity.class)
interface AttributesData {
// attributes of AttributesDataEntity that you need
}
@EntityView(CostDataEntity.class)
interface CostData {
// attributes of CostDataEntity that you need
}
查询看起来像这样
List<Consignment> dtos = entityViewManager.applySetting(
EntityViewSetting.create(Consignment.class),
criteriaBuilderFactory.create(em, ConsignmentEntity.class)
).getResultList();