스프링데이터 + JPA/QueryDSL

9. 검색 조건 쿼리

sdafdq 2023. 11. 28. 11:58

예시로 하나

@Test
public void search(){
    Member result = query.selectFrom(m)
            .where(m.username.eq("member1").and(m.age.eq(10)))
            .fetchOne();

    assertThat(result.getUsername()).isEqualTo("member1");
}

지금은 조건문은 eq, 조건 연결문?은 and만 썼는데,

엄청 많음

 

m.username.eq("member1") // username = 'member1'
m.usernmae.ne("member1") // username != 'member1' 즉 not equal
m.username.eq("member1").not() // username != 'member1' 기존 조건식에 ! 붙여주는 그런 거 인듯?

m.username.isNotNull() // null이 아니면 true 리턴

m.age.in(10,20) // age in (10, 20) 
m.age.notIn(10, 20) // age not in(10, 20)
m.age.between(10, 30) // between 10, 30

m.age.goe(30) // age >= 30 즉 greate then or equal
m.age.gt(30) // age > 30 즉 greate then
m.age.lt(30) // age < 30 즉 less then
m.age.loe(30) // age <= 30 즉 less then or eqaul

m.username.like("member%") // like 'member%' 퍼센트는 원하는 곳에 넣어주면 됨.
m.username.contains("member") // like '%member%' 퍼센트를 알아서 넣어줌. contains 이니
m.username.startsWith("member") // like 'member%' 이것도 퍼센트를 알아서 넣어줌. endsWith도 있음.

이렇게 그냥 sql에 있는 조건식은 다 있다고 생각하면 됨. 다만 메소드로 한다는 거

 

참고로, and는

@Test
public void search(){
    Member result = query.selectFrom(m)
            .where(
                    m.username.eq("member1"),
                    m.age.eq(10)
            )
            .fetchOne();

    assertThat(result.getUsername()).isEqualTo("member1");
}

where 안에서는 저렇게 인자들로 여러 개 넘기면 and로 연결함.

들어가는 인자 보면

Predicate... 이렇게 넣어놓은 만큼 배열로 가져오도록 해놓음.

내부적으로 오버라이드도 되어 있을거임.

 

그래서 이렇게 and 같은 경우는 여러 방법으로 짤 수 있는데,

어떤 방법을 하든 자유지만, and만 있을 경우는 저렇게 인자로 여러 조건들을 넣어주면 좋은게,

null은 무시함.

즉, 저 조건 객체들 생성하는데 조건을 안 넣었을 경우 그냥 그걸 null로 만들어 버리면,

동적 쿼리 짜기 너무 편함.

 

 

'스프링데이터 + JPA > QueryDSL' 카테고리의 다른 글

11. 정렬  (0) 2023.11.28
10. 결과 조회  (0) 2023.11.28
8. Q타입  (0) 2023.11.28
7. JPQL vs QueryDSL  (0) 2023.11.28
6. 예제 도메인 모델  (0) 2023.11.28