2016-07-02 10 views
1

Ich versuche, eine Abfrage wie folgt in JPA zu implementieren:JPA wie Spalten aggregieren in einem Join

SELECT 
    ta.field_aggr_1, 
    ta.field_aggr_2, 
    MIN(tb.date_inv) AS min_date_inv, 
    MAX(tb.date_inv) AS max_date_inv 

FROM table_a ta 
INNER JOIN table_b tb ON ta.idB = tb.id 

GROUP BY 
    ta.field_aggr_1, 
    ta.field_aggr_2 

Der entscheidende Punkt ist die MIN und MAX Funktionen, die in einer Spalte einer verknüpften Tabelle anwenden.

Ich habe die Objekte erstellt:

@Entity 
@Table(name="table_a") 
public class EntityA extends Serializable { 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private Long id; 

    @Column(name="field_aggr_1") 
    private String field_aggr_1;  

    @Column(name="field_aggr_2") 
    private String field_aggr_2;  

    @ManyToOne 
    @JoinColumn(name="idB") 
    private EntityB entityB; 

    // Getters & Setters & HashCode & equals & toString 
} 

@Entity 
@Table(name="table_b") 
public class EntityB extends Serializable { 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private Long id; 

    @Column(name="date_inv") 
    private String date_inv;  

    // Getters & Setters & HashCode & equals & toString 
} 

Und in der Service, den ich Abfrage erstellen möchten:

EntityManager em = ...; 
Root<EntityA> root = criteriaQuery.from(EntityA.class); 
EntityType<EntityA> type = this.em.getMetamodel().entity(EntityA.class); 
Join<EntityA, EntityB> join = root.join(type.getDeclaredSingularAttribute("entityB", EntityB.class)); 

List<Selection<?>> fields = new ArrayList<Selection<?>>(); 

// grouping fields 
fields.add(root.<EntityA>get("field_aggr_1")); 
fields.add(root.<EntityA>get("field_aggr_2")); 

Ich habe es geschafft enthalten Felder aus der verknüpften Tabelle,

fields.add(join.<EntityB>get("date_inv")); 

ABER es ist mir nicht gelungen, die Min-Aggregation zu implementieren.

Vielen Dank im Voraus für Ihre Antworten!

+1

Was ist falsch mit "cb.min (...)" wo cb ist CriteriaBuilder? Sie finden das in JPA-Kriterienbeispielen im Internet –

+0

Warum verwenden Sie nicht JPQL? –

+0

Hallo @ NeilStockton, danke für unseren Kommentar. Ich habe versucht, cd.min (...) zu verwenden, aber ich brauche einen Ausdruck und ich weiß nicht, wie man einen Ausdruck aus einem Join extrahiert, wo die Daten, die ich brauche, sind. – jherranzm

Antwort

1

Ich habe es geschafft, die Frage zu lösen. Zuerst musste ich noch einen „root“ und eine weitere „entityType“ für die verbundene Einheit haben:

Root<EntityB> rootB = criteriaQuery.from(EntityB.class); 
EntityType<EntityB> typeB = this.em.getMetamodel().entity(EntityB.class); 

Mit diesem jetzt kann ich tun, was ich brauchte:

fields.add(builder.least(rootB.get(typeB.getDeclaredSingularAttribute("date_inv", String.class)))); 
fields.add(builder.greatest(rootB.get(typeB.getDeclaredSingularAttribute("date_inv", String.class)))); 

Hoffnung, dass es hilft jemandem!

Verwandte Themen