Hibernate中使用多个连接的不同总和

时间:2014-12-03 17:31:15

标签: sql hibernate postgresql jpa aggregate-functions

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

在线,它说我需要子查询我的聚合。但是,我需要连接所有这些表以获取与该目录相关的文件,该文件与该组相关的用户有关。我怎么能做一个明确的总和?

@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。
  • 许多导演到一个努者。
  • 许多文件到一个目录。
  • 许多历史记录与一个女人。

1 个答案:

答案 0 :(得分:0)

您的基本问题似乎是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"

这主要是猜测,因为你没有透露你的关系模型,你提出的查询仍然没有加起来。