【问题标题】:JPQL: get the newest itemsJPQL:获取最新项目
【发布时间】:2012-06-18 12:04:48
【问题描述】:

我有一个具有这些属性的表和 Java 实体:

通知

-ID

-范围

-活动

-用户

-创建时间

-readTime (null --> 新消息)

如何使用一条 JPQL 语句获取每个范围和活动的最新通知? 由于 JPA(版本 1.0,没有可用的 Criteria API)不支持“SELECT TOP”或语句中的 LIMIT 运算符(仅通过 Entity Manager (em.setmax…))我找不到解决方案…… 有没有办法只用一个 JPQL 语句来完成这项任务? 使用原生 SQL 获取 LIMIT 或 TOP 无解……

例子:

Notification 1
-Id:1
-scope:test
-activity:1
-user:user1
-cTime: 01.01.1999

Notification 2
-Id:2
-scope:test
-activity:1
-user:user1
-cTime: 02.02.2000


Notification 3
-Id:3
-scope:dev
-activity:2
-user:user1
-cTime: 01.01.1997

这应该返回:通知 2 和 3

【问题讨论】:

    标签: jpa jpql


    【解决方案1】:

    您可以尝试以下查询,可以相应地更改字段的顺序。

    //-- MAX_RESULT_SIZE is the number of results to be fetched
    entityManager.createQuery("SELECT n.scope, n.activity, MAX(n.Id) FROM Notification n GROUP BY n.scope, n.activity ORDER BY n.cTime DESC").setMaxResults(MAX_RESULT_SIZE);
    

    要从此查询中检索结果,即对象数组,请参阅here

    【讨论】:

    • 抱歉,这并不能解决问题...请看示例。您必须对实体进行分组,然后为每个组获取最新项目...
    • 我认为这不是解决方案。对 id 进行分组没有任何意义......此外,我需要从 em 中返回实体,而不是“n.scope,n.activity,n.Id”......
    • @mischu 是数据库中的条目,以引用 cTime 的顺序排列。如果是这种情况,我已经更新了查询。
    • ID 是一个序列并且是随机的,因此 MAX(n.id) 不起作用...此外,由于 GROUP BY,“ORDER BY n.cTime DESC”不适用于 JPA 1。 ..
    猜你喜欢
    • 2017-11-26
    • 2021-10-05
    • 2020-02-22
    • 1970-01-01
    • 2015-06-14
    • 2018-11-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多