Ref: QueryDSL_Scenario: Verifying QueryDSL Setup


H2-1. Test Code

전제: Reference Setup 환경을 기반으로 진행한다.


package com.hooby.querydsl.domain.entity;

import com.querydsl.jpa.impl.JPAQueryFactory;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;

import static org.assertj.core.api.Assertions.*;

@SpringBootTest
@Transactional
public class QueryDSLBasicTest {
    @PersistenceContext
    EntityManager em;

    @BeforeEach
    public void setUp(){
        Master masterA = new Master("masterA");
        Master masterB = new Master("masterB");
        em.persist(masterA);
        em.persist(masterB);

        Slave slave1 = new Slave("slave1", 10, masterA);
        Slave slave2 = new Slave("slave2", 20, masterB);
        Slave slave3 = new Slave("slave3", 30, masterA);
        Slave slave4 = new Slave("slave4", 40, masterB);
        em.persist(slave1);
        em.persist(slave2);
        em.persist(slave3);
        em.persist(slave4);
    }

    @Test // Scenario: Find slave1
    public void testJPQL(){
        // JPQL Query to find slave1 by slaveName
        String qlString =
                "select s from Slave s " +
                "where s.slaveName = :slaveName";

        Slave found = em.createQuery(qlString, Slave.class)
                .setParameter("slaveName", "slave1")
                .getSingleResult();

        assertThat(found.getSlaveName()).isEqualTo("slave1");
    }

    @Test // Scenario: Find slave1 using QueryDSL
    public void testQueryDSL(){
        // QueryDSL Query to find slave1 by slaveName
        JPAQueryFactory queryFactory = new JPAQueryFactory(em);
        QSlave s = new QSlave("nigger"); // nigger is query alias, s is dsl alias

        Slave found = queryFactory
                .select(s)
                .from(s)
                .where(s.slaveName.eq("slave1")) // Parameter Binding
                .fetchOne();

        assert found != null;
        System.out.println("⚠️⚠️⚠️⚠️⚠️ Test found slaveName : " + found.getSlaveName());
        assertThat(found.getSlaveName()).isEqualTo("slave1");

    }
}

Hibernate: 
select
    s1_0.slave_id,
    s1_0.age,
    s1_0.master_id,
    s1_0.slave_name 
from
    slave s1_0 
where
    s1_0.slave_name =?

H2-2. Concept

H3-1. JPAQueryFactory

H3-2. JPQL vs QueryDSL

H3-3. JPAQueryField를 필드로 둔 경우

H2-3. Q-Type 활용

H3-1. Alias 사용하는 방법

H3-2. Default Instance 사용하는 방법 👍🏻