2017-04-21 114 views
1

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

回答

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包含了公司實體的構造函數。

0

我不這麼認爲,參數順序必須匹配JPA。這可能是因爲,在Java 8之前,參數名稱只有在字節碼包含調試信息時纔可用。我的猜測是,大多數JPA提供者最終會致電Constructor.newInstance(),這裏的參數必須正確排序。