【问题标题】:Get grouped MAX results of another table in JPQL在 JPQL 中获取另一个表的分组 MAX 结果
【发布时间】:2013-04-29 15:15:46
【问题描述】:

我有两个实体:

  • 帐户,包含属性 accountId
  • ImportRun,它有一个属性 runId。 从 ImportRun 到 Account 存在一对多(双向)关系。

可能有多个具有相同 accountId 的帐户引用具有不同 runId 的不同 ImportRuns(例如,每天一个)。

我想获取给定一组 accountIds 的最新 runIds(这是一种业务密钥,而不是休眠实体密钥),或者更好的是一组 Accounts,其中每个账户都引用最新的现有 ImportRun (因此此 ImportRun 的 runId 在具有此 accountId 的 Accounts 引用的所有 ImportRuns 中具有最高的 runId)。换句话说:我想获得最新的帐户。 不幸的是,我不能使用本机 SQL,那会很容易。我已经设法用 JPQL 只用一个给定的 accountId 来做这种事情,但我不知道如何通过几个给定的 accountId 对每个 runId 的最大结果进行分组。

我如何使用 JPQL 做到这一点?

【问题讨论】:

  • 我的理解是:“从 ImportRun 到 Account 存在一对多(双向)关系。”所以在帐户中,你有这样的东西吗? @OneToMany private List<ImportRun> importRuns;
  • 不,恰恰相反。在 ImportRun 我有以下内容:List。在 Account 中,有一个属性 importRun。稍微解释一下:每晚都会运行一批导入一组帐户。此批次称为“ImportRun”。所以这些导入运行中的每一个都有一个runId,它是一种用于标识运行时间的时间戳。现在的用例是获取定义数量的账户,给定它们的 accountIds(业务密钥)——它们中的每一个都可以在具有不同 runId 的完全不同的 ImportRun 中。我想获取最新的。

标签: sql hibernate jpa jpql


【解决方案1】:

下次包含代码,但要获取给定帐户 ID 集的最新运行 ID:

SELECT a.accountId, MAX(r.runId) FROM Account a INNER JOIN a.importRun r WHERE a.accountId IN :accountIds GROUP BY a.accountId

使用这个乱七八糟的 JPA 查询来获取最近帐户的列表:

SELECT a FROM Account a INNER JOIN a.importRun r WHERE r.runId = (SELECT MAX(ri.runId) FROM Account ai INNER JOIN ai.importRun ri WHERE ai.accountId = a.accountId)

希望这会有所帮助!

【讨论】:

  • 抱歉没有包含代码,非常感谢!像魅力一样工作!
猜你喜欢
  • 2019-07-30
  • 2016-12-25
  • 2018-05-15
  • 1970-01-01
  • 2011-12-31
  • 2013-06-20
  • 2022-01-12
  • 2021-10-15
  • 1970-01-01
相关资源
最近更新 更多