【问题标题】:Distinct sum in Hibernate using multiple joinsHibernate中使用多个连接的不同总和
【发布时间】:2014-12-03 17:31:14
【问题描述】:

我正在尝试获取组目录中包含的文件大小的总和。 但是,由于从联接返回的行数,大小正在成倍增加。我的查询中还包含其他表来获取历史信息。我有一个 PostgreSQL 数据库,并且在我的存储库界面中使用休眠查询。

在线,它说我需要子查询我的聚合。但是,我需要加入所有这些表以获取与目录相关的文件,这些文件与与组相关的用户相关。我怎样才能做一个不同的总和?

@Query(value = "select a.username as name, sum(d.filesize) as size"
        + "from usergroup a "
        + "join a.nuser b "
        + "join b.directory c "
        + "join c.files d "
        + "join b.nuserhistory e"
        + "group by a.name"
        + "having count(e) > b.maxCount")

表之间的关系:

  • 许多用户组到许多 nusers。
  • 一个 nuser 拥有多个目录。
  • 多个文件到一个目录。
  • 一位用户了解许多历史。

【问题讨论】:

  • join.b.history e 是哪一行?看起来像一个错字。此外,所有连接条件都丢失了,groupuser 是保留字,不能像这样用作不带引号的标识符。请提供有效的语法。
  • 抱歉,我试图简化查询的语法以更清楚地显示我遇到的问题,我还不得不更改一些模型名称。
  • 仍然缺少加入条件。这些对于答案是必不可少的。此外,必须了解您的关系设计(表定义)才能了解乘法发生的位置。这是一个相关的答案和解释:stackoverflow.com/questions/12464037/…
  • 添加了连接条件。因为这是一个休眠 jpa 查询,所以条件是在模型中指定的,而不是在查询中。

标签: sql hibernate postgresql jpa aggregate-functions


【解决方案1】:

您的基本问题似乎是加入 nuserhistory(每 1 个用户 n 行)使行数相乘,从而导致 count()sum() 的值不正确。

在您加入子查询之前为每个用户聚合(计数)行。相应地将HAVING 条件转换为WHERE 条件。 SQL 可能看起来像这样:

SELECT a.username AS name    -- "username" comes from table "usergroup"??
     , sum(c.filesize) AS size
FROM   usergroup   g
JOIN   a.nuser     a ON ???  -- join conditions unknown
JOIN   b.directory b ON ???
JOIN   c.files     c ON ???
JOIN  (
   SELECT user_id, count(*) AS ct
   FROM   b.nuserhistory
   GROUP  BY user_id       -- assuming user_id as foreign key column
   ) d ON d.user_id = a.id
WHERE  d.ct > a.maxCount   -- mixed case name without double quotes?
GROUP  BY a.username;      -- cannot be "a.name"

这在很大程度上是猜测,因为您没有透露您的关系模型并且您提供的查询仍然没有加起来。

【讨论】:

    猜你喜欢
    • 2011-01-16
    • 2015-05-21
    • 2012-06-02
    • 2022-10-01
    • 1970-01-01
    • 2021-05-21
    • 2021-03-18
    • 2012-12-12
    • 2021-01-31
    相关资源
    最近更新 更多