📦 Database/QueryDSL
Query Builder - JPQL vs QueryDsl
신건우
2023. 5. 20. 17:40
💡 JPQL vs QueryDsl
EntityManafer와 JPAQueryFactoru를 클래스의 생성자로 준다.
테스트 코드 작성
JPQL과 QueryDSL의 차이점
- JPQL(문자)은 실행 시점에 오류가 나고 QueryDsl(코드)은 컴파일 타임에 오류가 난다.
- JPQL은 파라미터 바인딩을 직접하지만, QueryDsl은 동적으로 처리된다.
Q-Type에 별칭을 지정할 수 있다.
실행되는 JPQL을 보고 싶으면 application.yml에 다음을 추가한다.
spring.jpa.properties.hibernate.use_sql_comments: true
@SpringBootTest
@Transactional
class QueryDslBasicTest @Autowired constructor(
@PersistenceContext
val em: EntityManager,
val emf: EntityManagerFactory,
val queryFactory: JPAQueryFactory
) {
@BeforeEach
fun before() {
val teamA = Team("teamA")
val teamB = Team("teamB")
em.persist(teamA)
em.persist(teamB)
val member1 = Member("member1", 10, teamA)
val member2 = Member("member2", 20, teamA)
val member3 = Member("member3", 30, teamB)
val member4 = Member("member4", 40, teamB)
em.persist(member1)
em.persist(member2)
em.persist(member3)
em.persist(member4)
}
@Test fun startJPQL() {
val qlString: String = """
select m from Member m
where m.name =: name
""".trimIndent()
val findMember = em.createQuery(qlString, Member::class.java)
.setParameter("name", "member1")
.singleResult
assertThat(findMember.name).isEqualTo("member1")
}
@Test
fun startQuerydsl() {
// Q Type 별칭 지정
val m = QMember("m")
val findMember = queryFactory
.select(m)
.from(m)
.where(m.name.eq("member1"))
.fetchOne()
assertThat(findMember?.name).isEqualTo("member1")
}
}