JPAQueryFactory(EntityManager)로 query를 만든다.
기존 JPQL로 제작할 때,
@Test
public void startJPQL() throws Exception {
//member1을 찾아라
Member findByJPQL = em.createQuery("select m from Member m where m.username = :username", Member.class)
.setParameter("username", "member1")
.getSingleResult();
assertThat(findByJPQL.getUsername()).isEqualTo("member1");
}
QueryDsl을 도입하게 되면?
java로 쿼리를 실행시킬 수 있어, Runtime때 오류를 파악할 수 있었던
JPQL과는 다르게 Runtime 이전에 오류를 잡아낼 수 있다. (오타라던지)
또한 파라미터 바인딩도 자동으로 해준다.
@Test
public void startQuerydsl() throws Exception {
//member1을 찾아라
Member findMember = queryFactory
.select(member)
.from(member)
.where(member.username.eq("member1"))
.fetchOne();
assertThat(findMember.getUsername()).isEqualTo("member1");
}
기본적으로 제공되는 메서드는 거의 SQL기능과 동일하다.
member.username.eq("member1") // username = 'member1'
member.username.ne("member1") //username != 'member1'
member.username.eq("member1").not() // username != 'member1'
member.username.isNotNull() //이름이 is not null
member.age.in(10, 20) // age in (10,20)
member.age.notIn(10, 20) // age not in (10, 20)
member.age.between(10,30) //between 10, 30
member.age.goe(30) // age >= 30
member.age.gt(30) // age > 30
member.age.loe(30) // age <= 30
member.age.lt(30) // age < 30
member.username.like("member%") //like 검색
member.username.contains("member") // like ‘%member%’ 검색
member.username.startsWith("member") //like ‘member%’ 검색
검색 유형
chain and 조건
//chain and 조건
@Test
public void search() throws Exception {
Member findMember = queryFactory.selectFrom(member)
.where(member.username.eq("member1")
.and(member.age.eq(10)))
.fetchOne();
assertThat(findMember.getUsername()).isEqualTo("member1");
}
, and 조건
//, and 조건
@Test
public void searchAndParam() throws Exception {
Member findMember = queryFactory.selectFrom(member)
.where(member.username.eq("member1"),
member.age.eq(10)
).fetchOne();
assertThat(findMember.getUsername()).isEqualTo("member1");
}
(e1 or e2) and e3
// 구현 : e1.or(e2).and(e3))
// 실 동작 쿼리 : (e1 or e2) and e3
@Test
public void searchTest1() throws Exception {
Member findMember = queryFactory.selectFrom(member)
.where((member.username.eq("member1").or(member.age.eq(10)))
,member.age.goe(10)
).fetchOne();
assertThat(findMember.getUsername()).isEqualTo("member1");
/* select member1
from Member member1
where (member1.username = 'member1'1 or member1.age = 102) and member1.age >= 103 */
}
(e1 or e2) and (e3 or e4)
// 구현 : e1.or(e2).and(e3.or(e4)))
// 실 동작 쿼리 : (e1 or e2) and (e3 or e4)
@Test
public void searchTest2() throws Exception {
Member findMember = queryFactory.selectFrom(member)
.where(member.username.eq("member1").or(member.age.eq(10)).and(member.age.goe(10).or(member.age.goe(5)))
).fetchOne();
assertThat(findMember.getUsername()).isEqualTo("member1");
/* select member1
from Member member1
where (member1.username = ?1 or member1.age = ?2) and (member1.age >= ?3 or member1.age >= ?4) */
}
(e1 and e2) or (e3 and e4)
✨ 유의사항
SQL에서 and가 상위 (먼저 실행) 명령이라 나가는 쿼리는e1 and e2 or e3 and e4
But, 실 동작은(e1 and e2) or (e3 and e4)
이렇게 된다.
// 구현 : e1.and(e2).or(e3.and(a4))
// 실 동작 쿼리 : e1 and e2 or e3 and e4
@Test
public void searchTest3() throws Exception {
JPAQuery<Member> member1 = queryFactory.selectFrom(member)
.where(member.username.eq("member1").and(member.age.eq(10)).or(member.age.goe(10).and(member.age.goe(5)))
).fetchAll();
Member findMember = member1.fetchFirst();
assertThat(findMember.getUsername()).isEqualTo("member1");
/* select member1
from Member member1 fetch all properties
where member1.username = 'member1'1 and member1.age = 102 or member1.age >= 103 and member1.age >= 54 */
}
'스프링 > QueryDsl' 카테고리의 다른 글
[QueryDsl] 서브쿼리 사용하기 (0) | 2022.03.10 |
---|---|
[QueryDsl] Join + On절 + Fetch join (0) | 2022.03.08 |
[QueryDsl] 정렬, 페이징, Tuple을 이용한 특정 값 Select (max,min,avg,sum 등) (0) | 2022.03.06 |
[Querydsl] 다양한 Fetch 결과 받아보기 (0) | 2022.03.05 |
[QueryDsl] QueryDsl 설정방법 (0) | 2022.03.03 |