@Test // Aggregation Functions
public void testAggregation() {
List<Tuple> tuples = queryFactory
.select(
slave.count(),
slave.age.sum(),
slave.age.avg(),
slave.age.max(),
slave.age.min())
.from(slave)
.fetch();
Tuple tuple = tuples.get(0);
assertThat(tuple.get(slave.count())).isEqualTo(4);
assertThat(tuple.get(slave.age.sum())).isEqualTo(100);
assertThat(tuple.get(slave.age.avg())).isEqualTo(25);
assertThat(tuple.get(slave.age.max())).isEqualTo(40);
assertThat(tuple.get(slave.age.min())).isEqualTo(10);
}
Slave 기점으로 사용 X (못믿겠음 위에꺼로 해보던가)
@Test // Group By
public void testGroup() throws Exception {
List<Tuple> tuples = queryFactory
.select(master.name, slave.age.avg())
.from(slave)
.join(slave.master, master) // Slave가 연관관계 Owner이므로 Slave에서 Master로 Join
.groupBy(master.name) // Group의 기준은 Master
.fetch();
Tuple tupleA = tuples.get(0);
Tuple tupleB = tuples.get(1);
assertThat(tupleA.get(master.name)).isEqualTo("masterA");
assertThat(tupleA.get(slave.age.avg())).isEqualTo(20);
assertThat(tupleB.get(master.name)).isEqualTo("masterB");
assertThat(tupleB.get(slave.age.avg())).isEqualTo(30);
}
@Test // GroupBy with Having
public void testGroupWithHaving() throws Exception {
List<Tuple> tuples = queryFactory
.select(master.name, slave.age.avg())
.from(slave)
.join(slave.master, master)
.groupBy(master.name)
.having(slave.age.avg().gt(25)) // Average Age가 25보다 큰 Master만 조회
.fetch();
assertThat(tuples).hasSize(1);
Tuple tuple = tuples.get(0);
assertThat(tuple.get(master.name)).isEqualTo("masterB");
assertThat(tuple.get(slave.age.avg())).isEqualTo(30);
}