首页 > 解决方案 > QueryDSL fetch 加入没有 groupby 的请求 GROUP BY

问题描述

我想使用 fetch join 急切地获得与 QueryDSL 的嵌套关联。

这个查询非常有效:

entityManager.createQuery("select player from Player player " +
                "left outer join fetch player.encryptions encryption " +
                "left outer join fetch encryption.result result " +
                "left outer join fetch encryption.question question " +
                "where player.nickName = :nickName ")
                .setParameter("nickName", nickName)
                .getSingleResult();

但是这个(写在QueryDSL上)

queryFactory.from(qPlayer)
                .leftJoin(qPlayer.encryptions, qEncryption).fetchJoin()
                .leftJoin(qEncryption.result, qResult).fetchJoin()
                .leftJoin(qEncryption.question).fetchJoin()
                .where(qPlayer.nickName.eq(nickName))
                .select(Projections.constructor(PlayerScore.class, qPlayer, qResult.pointsAmount.sum()))
                .fetchOne();

出于某种神奇的原因,尽管我什至不使用它,但还是要求按子句分组。

更具体地说,QueryDSL 请求属于这样的例外:

ERROR: column "player0_.id" must appear in the GROUP BY clause or be used in an aggregate function

这两个代码片段生成的 SQL 查询略有不同。QueryDSL 在select子句中有两个额外的片段:

select
player0_.id as col_0_0_,
sum(result2_.points_amount) as col_1_0_,
...

是重复的,我认为这player0_.id是它失败的原因。我也认为这是 QueryDSL 错误。

标签: javahibernatejpaquerydsl

解决方案


推荐阅读