Я хочу охотно получить вложенные ассоциации с 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();
для некоторых волхвов c рассуждает разума по группам, несмотря на то, что я даже не использую его.
Чтобы быть более точным c, запрос 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.