Query Builder - 검색 조건 쿼리

2023. 5. 20. 18:54·📦 Database/QueryDSL

💡검색 조건 쿼리

검색 조건은 .and() & .or() 메서드 체인으로 연결하여 조건을 추가할 수 있다.

@SpringBootTest  
@Transactional  
class SearchTest @Autowired constructor(  
    @PersistenceContext  
    val em: EntityManager,  
    val queryFactory: JPAQueryFactory  
) {  

    /** @desc 기본 검색 쿼리 */    
    @Test  
    fun search() {  
        val m: QMember = QMember("m")  

        val findMember = queryFactory  
            .selectFrom(m)  
            .where(m.name.eq("member1").and(m.age.eq(10)))  
            .fetchOne()  

        assertThat(findMember?.name).isEqualTo("member1")  

        m.name.eq("member1")  
        m.name.ne("member2")  
        m.name.eq("member1").not()  

        m.name.isNotNull  

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

        m.age.goe(30) // age >= 30  
        m.age.gt(30) // age > 30  
        m.age.loe(30) // age <= 30  
        m.age.lt(30) // age < 30  

        m.name.like("member%") // like 검색  
        m.name.contains("member") // like %member% 검색  
        m.name.startsWith("member") // like member% 검색  
    }  

    /** @desc And 조건을 파라미터로 처리 */    
    @Test  
    fun searchAndParam() {  
        val m: QMember = QMember("m")  

        val result: List<Member> = queryFactory  
            .selectFrom(m)  
            .where(m.name.eq("member1"))  
            .fetch()  

        assertThat(result.size).isEqualTo(1)  

        //List  
        val fetch: List<Member> = queryFactory  
            .selectFrom(m)  
            .fetch()  

        //단 건  
        val findMember1: Member? = queryFactory  
            .selectFrom(m)  
            .fetchOne()  

        //처음 한 건 조회  
        val (id, name, age, team) = queryFactory  
            .selectFrom(m)  
            .fetchFirst()  

        //페이징에서 사용  
        val results: QueryResults<Member> = queryFactory  
            .selectFrom(m)  
            .fetchResults()  

        //count 쿼리로 변경  
        val count = queryFactory  
            .selectFrom(m)  
            .fetchCount()  
    }  
}

JPQL이 제공하는 모든 검색 조건

and 메서드:
- 기능: 두 개의 조건을 AND 연산으로 결합합니다.
- 사용 예시: builder.and(condition1)


or 메서드:
- 기능: 두 개의 조건을 OR 연산으로 결합합니다.
- 사용 예시: builder.or(condition1)


not 메서드:
- 기능: 조건을 부정합니다.
- 사용 예시: builder.not(condition)


value 메서드:
- 기능: BooleanBuilder 객체를 불리언 조건으로 변환합니다.
- 사용 예시: val condition = builder.value


isNull 메서드:
- 기능: 주어진 필드가 NULL인지 확인하는 조건을 추가합니다.
- 사용 예시: builder.isNull(field)


isNotNull 메서드:
- 기능: 주어진 필드가 NULL이 아닌지 확인하는 조건을 추가합니다.
- 사용 예시: builder.isNotNull(field)


eq 메서드:
- 기능: 주어진 필드와 값이 같은지 확인하는 조건을 추가합니다.
- 사용 예시: builder.eq(field, value)


ne 메서드:
- 기능: 주어진 필드와 값이 다른지 확인하는 조건을 추가합니다.
- 사용 예시: builder.ne(field, value)


gt 메서드:
- 기능: 주어진 필드가 주어진 값보다 큰지 확인하는 조건을 추가합니다.
- 사용 예시: builder.gt(field, value)


lt 메서드:
- 기능: 주어진 필드가 주어진 값보다 작은지 확인하는 조건을 추가합니다.
- 사용 예시: builder.lt(field, value)


gte 메서드:
- 기능: 주어진 필드가 주어진 값보다 크거나 같은지 확인하는 조건을 추가합니다.
- 사용 예시: builder.gte(field, value)


lte 메서드:
- 기능: 주어진 필드가 주어진 값보다 작거나 같은지 확인하는 조건을 추가합니다.
- 사용 예시: builder.lte(field, value)


m.name.eq("member1")  
m.name.ne("member2")  
m.name.eq("member1").not()  

m.name.isNotNull  

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

m.age.goe(30) // age >= 30  
m.age.gt(30) // age > 30  
m.age.loe(30) // age <= 30  
m.age.lt(30) // age < 30  

m.name.like("member%") // like 검색  
m.name.contains("member") // like %member% 검색  
m.name.startsWith("member") // like member% 검색

And 조건을 파라미터로 처리

where()에 파라미터로 검색조건을 추가하면 AND 조건이 추가된다.
이경우 null값은 무시 -> 메서드 추출을 활용해 동적 쿼리르 깔끔하게 만들수 있다.

/** @desc And 조건을 파라미터로 처리 */
@Test  
fun searchAndParam() {  
    val m: QMember = QMember("m")  

    val result: List<Member> = queryFactory  
        .selectFrom(m)  
        .where(m.name.eq("member1"))  
        .fetch()  

    assertThat(result.size).isEqualTo(1)  
}

결과 조회

fetch() : 리스트 조회

fetchOne() : 단건 조회

  • 결과가 없으면 Null
  • 결과가 둘 이상이면 NonUniqueResultException 발생

fetchFirst() : limit(1).fetchOne()

fetchResults() : 페이징 정보 포함, totle count 쿼리 추가 실행

fetchCount() : Count 쿼리로 변경해서 count 수 조회

/** @desc And 조건을 파라미터로 처리 */
@Test  
fun searchAndParam() {  
    val m: QMember = QMember("m")  

    val result: List<Member> = queryFactory  
        .selectFrom(m)  
        .where(m.name.eq("member1"))  
        .fetch()  

    assertThat(result.size).isEqualTo(1)  

    //List  
    val fetch: List<Member> = queryFactory  
        .selectFrom(m)  
        .fetch()  

    //단 건  
    val findMember1: Member? = queryFactory  
        .selectFrom(m)  
        .fetchOne()  

    //처음 한 건 조회  
    val (id, name, age, team) = queryFactory  
        .selectFrom(m)  
        .fetchFirst()  

    //페이징에서 사용  
    val results: QueryResults<Member> = queryFactory  
        .selectFrom(m)  
        .fetchResults()  

    //count 쿼리로 변경  
    val count = queryFactory  
        .selectFrom(m)  
        .fetchCount()  
}
저작자표시 (새창열림)

'📦 Database > QueryDSL' 카테고리의 다른 글

Query Builder - Aggregation & Group By & Having  (0) 2023.05.20
Query Builder - Sort, Paging  (0) 2023.05.20
Query Builder - JPQL vs QueryDsl  (0) 2023.05.20
Query Builder - 초기 설정  (2) 2023.05.20
QueryDsl - Boolean Builder  (0) 2023.05.19
'📦 Database/QueryDSL' 카테고리의 다른 글
  • Query Builder - Aggregation & Group By & Having
  • Query Builder - Sort, Paging
  • Query Builder - JPQL vs QueryDsl
  • Query Builder - 초기 설정
신건우
신건우
조용한 개발자
  • 신건우
    우주먼지
    신건우
  • 전체
    오늘
    어제
    • 분류 전체보기 (422)
      • 📘 Frontend (71)
        • Markup (1)
        • Style Sheet (2)
        • Dart (8)
        • Javascript (12)
        • TypeScript (1)
        • Vue (36)
        • React (2)
        • Flutter (9)
      • 📘 Backend (143)
        • Java (34)
        • Concurrency (19)
        • Reflection (1)
        • Kotlin (29)
        • Python (1)
        • Spring (42)
        • Spring Cloud (5)
        • Message Broker (5)
        • Streaming (2)
        • 기능 개발 (5)
      • 💻 Server (6)
        • Linux (6)
      • ❌ Error Handling (11)
      • 📦 Database (62)
        • SQL (31)
        • NoSQL (2)
        • JPQL (9)
        • QueryDSL (12)
        • Basic (4)
        • Firebase (4)
      • ⚙️ Ops (57)
        • CS (6)
        • AWS (9)
        • Docker (8)
        • Kubernetes (13)
        • MSA (1)
        • CI & CD (20)
      • 📚 Data Architect (48)
        • Data Structure (10)
        • Algorithm (8)
        • Programmers (17)
        • BaekJoon (5)
        • CodeUp (4)
        • Design Pattern (4)
        • AI (0)
      • ⚒️ Management & Tool (8)
        • Git (7)
        • IntelliJ (1)
      • 📄 Document (10)
        • Project 설계 (6)
        • Server Migration (3)
      • 📄 책읽기 (2)
        • 시작하세요! 도커 & 쿠버네티스 (2)
      • 🎮 Game (4)
        • Stardew Vally (1)
        • Path of Exile (3)
  • 블로그 메뉴

    • 링크

      • Github
    • 공지사항

    • 인기 글

    • 태그

      React #Markdown
      GStreamer #Pipeline
      Lock #Thread #Concurrency
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.0
    신건우
    Query Builder - 검색 조건 쿼리
    상단으로

    티스토리툴바