2016-08-24 103 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();

这仅仅是一个简单的例子列表。但希望你有一些流行语寻找;)