JPA 2个标准查询投影

问题描述:

使用JPA2条件查询,我们可以预测在DTO(例如)这样的最终结果:JPA 2个标准查询投影

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中使用类似的策略?

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

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