2016-07-02 94 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 

關鍵的一點是,在連接表的一列應用MINMAX功能。

我創建了實體:

@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 
} 

而且在我要創建查詢服務:

​​

我已經設法從包括連接表的字段,

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

但是我沒有成功實現min聚合。

在此先感謝您的答案!

+1

「cb.min(...)」是什麼問題,其中cb是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)))); 

希望它幫助別人!