전제: 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 =?