HQL查询到复杂的DTO

时间:2018-01-29 19:35:51

标签: java hibernate hql dto

我遇到了将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对象。如果有人有其他想法如何做到这一点 - 请分享您的想法。

2 个答案:

答案 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();