繁体   English   中英

在 HQL 查询中使用 join fetch 和 group by

[英]Using join fetch and group by in HQL query

我有一个Report实体,它有一个ReportedTime列表作为@OneToMany关系。 每个ReportedTime都有一个项目,而Project有一个经理。

查询本身(显示在底部)工作正常。 问题是我现在需要映射这些实体的DTO并为测绘目的,我需要知道,在每个项目ReportedTime在每个Report 所以我面临 n+1 问题,我想加入获取报告时间和项目:

 @Query(value = "select " +
            "t as timesheetReport, " +
            "FUNCTION('string_agg', tlpa.username, ',') as projectManagersUsernames, " +
            "case when " +
            "   FUNCTION('string_agg', tlpa.username, ',') like concat('%', :username, '%') " +
            "then true else false " +
            "end as assigned " +
            "from TimesheetReport t " +
            "left join fetch t.reportedTimes rt " +
            "left join fetch rt.project p " +
            "left join p.teamLeaderAssignments tlp " +
            "left join tlp.account tlpa " +
            "group by t " +
            "having sum(rt.workTime)>0 " +
            "order by assigned desc ")
    List<IReportWithManagers> findAllWithManagers(String username, Pageable pageable);

但我收到此错误:

org.postgresql.util.PSQLException: ERROR: column "reportedtimes1_.id" must appear in the GROUP BY clause or be used in an aggregate function

我试图在日志中查看 sql 查询,似乎在这种情况下,Hibernate 也在 select 子句中放置了reported_time.id和project.id,但不知道如何对其进行分组? 有没有办法解决这个问题?

您收到错误是因为,当然,在获取连接的实体时,您突然尝试选择一大堆既不包含在GROUP BY也不包含在聚合中的新列。

为了能够从rtp选择列,您需要GROUP BY t, rt, p ,不幸的是(据我所知)改变了查询的语义。 我会尝试添加单独的JOINS来获取和分组:

left join t.reportedTimes rt
left join rt.project p
left join fetch t.reportedTimes rt2
left join fetch rt.project p2
left join p.teamLeaderAssignments tlp
left join tlp.account tlpa
group by t, rt2, p2
having sum(dt.workTime)>0
order by assigned desc

上面的问题是,重复的行现在将进入聚合,所以也许您可以使用ARRAY_TO_STRING(ARRAY_AGG(DISTINCT tlpa.username, ',')或选择数组并在 Java 中加入字符串(不确定 Hibernate 是否支持选择不过,PostgreSQL 数组是开箱即用的,您需要检查一下)。

请注意,我还没有尝试过上述解决方案,所以我不能保证它会起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM