2017-04-21 5 views
1

Mit einem JPA2 Criteria Abfrage können wir das Endergebnis auf einem DTO (zum Beispiel) projizieren wie folgt aus:JPA 2 Kriterien Abfrage Projection

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))); 

Doch diese Methode ist abhängig von der Reihenfolge der Argumente in meine DTO-Klasse Das ist einfach falsch. Unter Verwendung der alten (jetzt veralteten) Hibernate-Kriterien-API könnten wir die Projektionsliste verwenden:

ProjectionList projectionList = Projections.projectionList();

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

Die hängt nicht von der Parameterreihenfolge des DTO ab.

Kann eine ähnliche Strategie in JPA verwendet werden?

Antwort

0

Ich ging weiter zu QueryDSL, die eine höhere Abstraktionsebene bietet und dieses Projektionsproblem löst. So eine Abfrage eine Einheit zu laden und eine DTO Rückkehr für das Unternehmen wird:

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(); 
} 

Wo CompanyDTO einen Konstruktor für das Unternehmen Entity enthält.

0

Ich glaube nicht, die Reihenfolge der Argumente muss in JPA übereinstimmen. Dies könnte daran liegen, dass Parameternamen bis Java 8 nur verfügbar waren, wenn der Bytecode Debug-Informationen enthält. Meine Vermutung ist, dass die meisten JPA-Anbieter am Ende rufen Constructor.newInstance() und hier muss das Argument korrekt bestellt werden.

Verwandte Themen