【问题标题】:Accessing list-based records from main record从主记录访问基于列表的记录
【发布时间】:2011-01-05 12:28:10
【问题描述】:

我有一个表 - 我们称它为 AAA,它对另一个表有一对多的定义,分配给 BBB。它看起来像这样:

public class AAA
{
...
   @OneToMany(orphanRemoval=true, fetch=FetchType.LAZY, mappedBy="aaa")
   private List<BBB> bbbs;
...
}

我想运行一个 JPA 查询,它将为我提供具有多个 BBB 的所有 AAA,因此我使用了SIZE(aaa.bbbs)。但是,我希望结果集按每个 aaa 中第一个 bbb 的时间戳排序。

一个真实的例子:我想获取我所有的 Facebook 朋友,按每个人添加到他们个人资料中的最新图片排序。在这种情况下,AAA 是“朋友”,而 BBB 将是“图片”,我想通过 Picture.CreatedTimestamp 订购朋友。

我基本上需要为每个 aaa 访问 bbbs 中的第一项,并按它排序。为了实现这个目标应该做些什么?

【问题讨论】:

    标签: java database jpa


    【解决方案1】:

    因此,您需要对 bbbs 进行两个聚合 - 一个用于确定大小,另一个用于查找最新时间戳。可以用JOINGROUP BY表示:

    SELECT a
    FROM AAA a JOIN a.bbbs b
    GROUP BY a.id, a.column1, a.column2
    HAVING COUNT(b) > 1
    ORDER BY MAX(b.timestamp) DESC
    

    【讨论】:

    • 你确定语法吗? “GROUP BY”在 JPA 中不起作用。在 MySQL 中它可以工作,但我正在使用 PostgreSQL 并寻找通用 JPA 解决方案......
    • @Eldad: GROUP BY 在 JPA 中工作,这是一个完全有效的 JPA 查询。
    • 进一步检查 JPA 文档,看来您是正确的,但实际上它不起作用(我使用的是 Hibernate)。当我尝试使用您的查询时遇到的异常是:“错误:列“aaa.some_aaa_column”必须出现在 GROUP BY 子句中或用于聚合函数中”。
    • @Eldad:其实你需要在GROUP BY中列出aaa的所有列。
    【解决方案2】:

    如果您使用的是 Hibernate,也许您可​​以使用过滤器(@Filter 和 @FilterDef)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多