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!
Was ist falsch mit "cb.min (...)" wo cb ist CriteriaBuilder? Sie finden das in JPA-Kriterienbeispielen im Internet –
Warum verwenden Sie nicht JPQL? –
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