Я пытаюсь выполнить запрос, как это в JPA:JPA как агрегировать столбцов в объединении
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
Ключевым моментом является MIN
и MAX
функции, которые применяются в одном столбце присоединяемой таблицы.
Я создал объекты:
@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
}
А на службе я хочу создать запрос:
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"));
мне удалось включать поля из присоединяемой таблицы,
fields.add(join.<EntityB>get("date_inv"));
НО НО мне не удалось реализовать агрегацию мин.
Заранее благодарим за ответы!
Что случилось с "cb.min (...)" где cb is CriteriaBuilder? Вы найдете, что в примерах критериев JPA в Интернете –
Почему вы не используете JPQL? –
Привет @NeilStockton, спасибо за наш комментарий. Я пытался использовать cd.min (...), но мне нужно выражение, и я не знаю, как извлечь выражение из соединения, где нужны данные, которые мне нужны. – jherranzm