2016-08-24 99 views
1

我有一個SQL查詢是這樣的:JPA加入表的SELECT

SELECT h.name, h.created_date, tbl.* 
FROM my_table tbl 
    LEFT JOIN 
    (SELECT name, max(created_date) created_date FROM my_table GROUP BY name) h 
    ON tbl.name = h.name; 

它從MY_TABLE與該名稱的最大CREATED_DATE一起返回行(它有多個名稱=「」)。

有沒有辦法在JPQL查詢中複製它?

這裏是實體類的要點,這是相當簡單:

@Entity 
@Table(name = "MY_TABLE") 
@XmlRootElement 
public class MyTable implements Serializable { 


    private BigDecimal tableId; 
    private String name; 
    private Date createdDate; 

    // ... 

    @Id 
    @Basic(optional = false) 
    @Column(name = "TABLE_ID") 
    @GeneratedValue(generator = "TBL_ID_SEQ") 
    public BigDecimal getTableId() { 
    return tableId; 
    } 

    @Basic(optional = false) 
    @Column(name = "NAME") 
    public String getName() { 
    return name; 
    } 

    @Basic(optional = false) 
    @Column(name = "CREATED_DATE", insertable = false) 
    @Temporal(TemporalType.TIMESTAMP) 
    public Date getCreatedDate() { 
    return createdDate; 
    } 

    // ... getters/setters 

} 
+0

和你的課是?因爲你知道JPQL是圍繞類/字段而不是表格/列 –

+0

我確實知道這一點。我對jpa很新,說實話,我還不熟悉jpql。實體類將是myTable,我試圖加入的名稱字段是一個字符串。也許這不是可以直接完成的事情? – user5668766

+0

也許我需要另一個實體類,只是返回最大日期和名稱字段?而不是嘗試使用同一個實體 – user5668766

回答

0

只是讀你的問題,我想你並不需要另一個實體。 JPA中的實體與SQL中的表相同。通常實體和表之間有1:1的關係。你只需要知道如何使用JPQ調用查詢。你需要一個實體經理來調用你的陳述。

EntityManagerFactory emf = Persistence.createEntityManagerFactory("PersistenceUnit"); EntityManager em = emf.createEntityManager();

你有一個POM文件,或配置的java文件來定義您的持久性單元,即。所以做你可以去編碼是這樣的:

Query q = em.createQuery("Your query in sql syntax as a string object");

關於你的實體,並調用查詢,您將收到使用

List<object> resultOfMyQuery = q.getResultList();

這僅僅是一個簡單的例子列表。但希望你有一些流行語尋找;)