H3-1. 노예 수, 나이 합, 평균 나이, 최대 나이, 최소 나이 Projection

@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);

}

H3-2. GroupBy → Master 기점 사용

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);
}

H3-3. GroupBy with Having

@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);
}