【问题标题】:JPA 2 Criteria Query ProjectionJPA 2 标准查询投影
【发布时间】:2017-04-21 18:48:44
【问题描述】:

使用 JPA2 标准查询,我们可以将最终结果投影到 DTO(例如)上,如下所示:

query.select(builder.construct( ProductGridDTO.class,
        root.get(Productos_.proId),
        root.get(Productos_.proAlias),
        root.get(Productos_.proNombre),
        companies.get(Companias_.ciaNombre),
        companies.get(Companias_.ciaId)));

但是,此方法取决于我的 DTO 类中的参数顺序,这是完全错误的。使用旧的(现已弃用)休眠标准 API,我们可以使用投影列表:

ProjectionList projectionList = Projections.projectionList();

    projectionList.add(Projections.property("id"), "id");
    projectionList.add(Projections.property("name"), "name");

这与 DTO 的参数顺序无关。

是否可以在 JPA 中使用类似的策略?

【问题讨论】:

    标签: jpa-2.1 hibernate-5.x


    【解决方案1】:

    我不这么认为,参数顺序必须在 JPA 中匹配。这可能是因为在 Java 8 之前,参数名称只有在字节码包含调试信息时才可用。我的猜测是大多数 JPA 提供者最终都会调用Constructor.newInstance(),并且这里的参数必须正确排序。

    【讨论】:

      【解决方案2】:

      我继续使用 QueryDSL,它提供了更高级别的抽象并解决了这个投影问题。因此,加载实体并为所述实体返回 DTO 的查询变为:

      public List<CompanyDTO> findByCompanyId(String companyId) {
          JPAQuery<?> query = new JPAQuery<Void>(em);
      
          QCompany company = QCompany.company;
      
          return query.from(company)
                  .where(company.companyId.eq(companyId))
                  .select(Projections.constructor(CompanyDTO.class, company))
                  .fetch();
      }
      

      CompanyDTO 包含公司实体的构造函数。

      【讨论】:

        猜你喜欢
        • 2012-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-31
        • 1970-01-01
        • 1970-01-01
        • 2020-02-11
        • 2012-04-05
        相关资源
        最近更新 更多