JPA 2 Criteria Query Projection

时间:2017-04-21 18:48:44

标签: jpa-2.1 hibernate-5.x

使用JPA2 Criteria Query我们可以在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类中的参数顺序,这是完全错误的。使用旧的(现已弃用的)hibernate标准API,我们可以使用投影列表:

ProjectionList projectionList = Projections.projectionList();

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

这不依赖于DTO的参数顺序。

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我转向使用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包含公司实体的构造函数。