2016-07-02 3 views
1

Я пытаюсь выполнить запрос, как это в 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")); 

НО НО мне не удалось реализовать агрегацию мин.

Заранее благодарим за ответы!

+1

Что случилось с "cb.min (...)" где cb is CriteriaBuilder? Вы найдете, что в примерах критериев JPA в Интернете –

+0

Почему вы не используете JPQL? –

+0

Привет @NeilStockton, спасибо за наш комментарий. Я пытался использовать cd.min (...), но мне нужно выражение, и я не знаю, как извлечь выражение из соединения, где нужны данные, которые мне нужны. – jherranzm

ответ

1

Мне удалось решить вопрос. Во-первых, мне нужно, чтобы иметь еще один «корень» и еще один «EntityType» для присоединенного юридического лица:

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

С этим, теперь я могу делать то, что мне было нужно:

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

надежду, что она помогает кому-то!

Смежные вопросы