【问题标题】:How to get the list of files, that has been recently updated or modified using JPA Criteria Query?如何获取最近使用 JPA Criteria Query 更新或修改的文件列表?
【发布时间】:2014-10-21 13:32:03
【问题描述】:

我是JPA Criteria Query的新手。Table 包含meta-datafiles 并且它可能有多个条目对应于file name 但它应该有不同的last modified dateTable .我需要的是 - 来自Tableunique 文件列表,但该列表应该包含最近更新或修改的所有文件。

假设我有一个TableObjectMetadata,其中有file-namelast-modifiedcolumns。

id, filename, lastmodified
01, A.txt,   25/10/2014
02, A.txt,   26/10/2014 
03, B.txt,   25/10/2014
04, B.txt,   27/10/2014 
05, C.txt,   25/10/2014
06, C.txt,   26/10/2014 
07, D.txt,   25/10/2014
08, D.txt,   27/10/2014  

我需要使用JPA Criteria Query 得到以下结果。 -

 id, filename, lastmodified
    02, A.txt,   26/10/2014 
    04, B.txt,   27/10/2014 
    06, C.txt,   26/10/2014 
    08, D.txt,   27/10/2014 

SQL 查询

SELECT filename, MAX(lastmodified) FROM objectmetadata GROUP BY filename;

【问题讨论】:

  • 您没有指出问题所在。另请注意:JPA 标准适用于映射的域实体,而不是表。您尚未显示任何映射。

标签: java subquery jpa-2.0 criteria-api


【解决方案1】:

您需要在您的 db 表和 JPA 实体之间进行映射,如下所示:

@Entity
public class ObjectMetadata {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;

    private String fileName;

    @Temporal(TemporalType.DATE)
    private Date lastModified;

    // constructors, getters, setters
}

查询可能如下所示:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Tuple> cq = cb.createTupleQuery();
Root<ObjectMetadata> root = cq.from(ObjectMetadata.class);
cq.multiselect(
    root.get("fileName").alias("filename"), 
    cb.greatest(root.<Date>get("lastModified").alias("lastmodified")
);
cq.groupBy(root.get("fileName"));

List<Tuple> result = em.createQuery(cq).getResultList()
for (Tuple t: result) {
    System.out.println(t.get("filename") + " " + t.get("lastmodified"));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多