QueryDSL을 이용해서 MySQL에서 제공하는 함수들 사용과 Group By를 사용하는 것을 보도록 하겠습니다.
@Test
void groupBy() {
factory = new JPAQueryFactory(em);
QTeam team = QTeam.team;
QMember member = QMember.member;
List<Tuple> result = factory.select(team.name, member.age.avg(), member.count())
.from(member)
.join(member.team, team) // member LEFT JOIN team
.groupBy(team.name)
.having(member.age.avg().goe(25)) // having도 사용 가능
.fetch();
for (Tuple tuple : result) {
System.out.println("tuple = " + tuple);
}
Tuple tupleA = result.get(0); //tuple = [TeamA, 35.0, 3]
Tuple tupleB = result.get(1); //tuple = [TeamB, 55.0, 1]
Assertions.assertThat(tupleA.get(member.age.avg())).isEqualTo(35);
Assertions.assertThat(tupleB.get(member.age.avg())).isEqualTo(55);
groupBy()를 통해 Grouping을 할 수 있으며, having()도 사용할 수 있습니다.
사용 가능한 함수들은 member.count(), member.age.sum(), member.age.avg(), member.age.max(), member.age.min() 등등이 있습니다. member.age.avg()를 할 경우, Member의 age의 평균 값을 가져옵니다.