본문 바로가기

JAVA

쿼리 DSL 메서드 종류

.where(m.age.gt(20))

 

WHERE age > 20

QueryDSL 비교 연산 메서드 목록

메서드 의미 SQL로 변환

.eq(x) equal =
.ne(x) not equal <>
.gt(x) greater than >
.goe(x) greater or equal >=
.lt(x) less than <
.loe(x) less or equal <=
.between(x, y) between BETWEEN x AND y

 예시

QMember m = QMember.member;

List<Member> result = queryFactory
    .selectFrom(m)
    .where(
        m.age.gt(20),        // age > 20
        m.age.lt(50),        // age < 50
        m.name.eq("홍길동")  // name = '홍길동'
    )
    .fetch();

 실제 SQL 변환 결과:

SELECT * FROM member
WHERE age > 20
  AND age < 50
  AND name = '홍길동';

정리

  • .gt() → greater than (>)
  • .lt() → less than (<)
  • .eq() → equal (=)
  • .ne() → not equal (≠)
  • .goe() / .loe() → >= / <=

 

 

 

쿼리 DLS 의 조건 여러개 붙이기 


기본 문법

.where(
    m.age.gt(20),     // age > 20
    m.name.eq("홍길동")
)

위처럼 여러 조건을 쉼표(,)로 나열하면
→ 기본적으로 AND 조건으로 연결

즉,

WHERE age > 20 AND name = '홍길동'

으로 바뀌어요 ✅


 AND / OR 직접 조합하기

 AND 조건

.where(
    m.age.gt(20)
     .and(m.status.eq("ACTIVE"))
)

👉 SQL:

WHERE age > 20 AND status = 'ACTIVE'

 

 OR 조건

.where(
    m.age.lt(18)
     .or(m.name.eq("홍길동"))
)

👉 SQL:

WHERE age < 18 OR name = '홍길동'

AND + OR 복합

.where(
    m.age.gt(20)
      .and(m.city.eq("Seoul")
      .or(m.city.eq("Busan")))
)

👉 SQL:

WHERE age > 20 AND (city = 'Seoul' OR city = 'Busan')

 BooleanBuilder 로 동적 조합하기 (실무 자주 사용)

조건이 선택적으로 들어올 때, BooleanBuilder를 사용하면 깔끔

public List<Member> search(String name, Integer age, String city) {
    QMember m = QMember.member;
    BooleanBuilder builder = new BooleanBuilder();

    if (name != null) {
        builder.and(m.name.eq(name));       // name = ?
    }
    if (age != null) {
        builder.and(m.age.gt(age));         // age > ?
    }
    if (city != null) {
        builder.or(m.city.eq(city));        // OR city = ?
    }

    return queryFactory
        .selectFrom(m)
        .where(builder)
        .fetch();
}

 동작 결과 (입력 값에 따라 자동으로 변함)

  • name, age만 입력 → WHERE name = ? AND age > ?
  • city만 입력 → WHERE city = ?

 .and() / .or() 이외의 조합 메서드

메서드 설명 SQL 변환

.isNull() null 비교 IS NULL
.isNotNull() not null 비교 IS NOT NULL
.in(list) in 조건 IN (...)
.notIn(list) not in 조건 NOT IN (...)
.between(a, b) 구간 BETWEEN a AND b
.like("%abc%") 문자열 포함 LIKE '%abc%'

 실제 예시 정리

QMember m = QMember.member;

List<Member> result = queryFactory
    .selectFrom(m)
    .where(
        m.age.between(20, 30)        // 20 <= age <= 30
            .and(m.city.in("Seoul", "Busan")) // city IN ('Seoul', 'Busan')
            .and(m.name.like("%길동%"))        // name LIKE '%길동%'
    )
    .fetch();

👉 SQL 변환:

SELECT * FROM member
WHERE age BETWEEN 20 AND 30
  AND city IN ('Seoul', 'Busan')
  AND name LIKE '%길동%';

 

QueryDSL의 .where() 안에서는

  • 쉼표(,) → AND 자동
  • .and(), .or() → 직접 조건 조합
  • BooleanBuilder → 동적 조건 생성

즉, SQL에서 WHERE, AND, OR 쓰는 걸
자바 코드로 안전하게 표현하는 방식

 


 BooleanBuilder 없이 QueryDSL에서 깔끔하게 동적 where 조건을 만드는  패턴


 예시

 Member 엔티티

@Entity
public class Member {
    @Id @GeneratedValue
    private Long id;
    private String name;
    private Integer age;
    private String city;
}

검색 조건을 담는 DTO (ex: 검색 폼, 필터 등):

@Data
public class MemberSearchCond {
    private String name;
    private Integer minAge;
    private Integer maxAge;
    private String city;
}

BooleanBuilder 없이 Predicate 함수로 깔끔하게 처리

public List<Member> search(MemberSearchCond cond) {
    QMember m = QMember.member;

    return queryFactory
        .selectFrom(m)
        .where(
            nameEq(cond.getName()),
            ageGoe(cond.getMinAge()),
            ageLoe(cond.getMaxAge()),
            cityEq(cond.getCity())
        )
        .fetch();
}

// ==== 조건별 함수 분리 ====
private BooleanExpression nameEq(String name) {
    return name != null ? QMember.member.name.eq(name) : null;
}

private BooleanExpression ageGoe(Integer minAge) {
    return minAge != null ? QMember.member.age.goe(minAge) : null;
}

private BooleanExpression ageLoe(Integer maxAge) {
    return maxAge != null ? QMember.member.age.loe(maxAge) : null;
}

private BooleanExpression cityEq(String city) {
    return city != null ? QMember.member.city.eq(city) : null;
}

핵심 포인트

  • .where() 안에서는 null인 조건은 자동으로 무시
    (이게 QueryDSL의 엄청난 장점))
  • 그래서 if문 없이 함수만 잘 쪼개두면,
    👉 조건이 있을 때만 자동 적용

 결과 예시

입력 조건 실제 SQL 결과

name=홍길동, minAge=null, city=null WHERE name = '홍길동'
minAge=20, maxAge=30, city='Seoul' WHERE age >= 20 AND age <= 30 AND city = 'Seoul'
아무 조건 없음 WHERE 1=1 (전체 조회)

장점

항목 설명

*가독성 높음 if문 없이 함수 조합식으로 깔끔
*재사용 쉬움 조건 함수만 따로 재활용 가능
*유지보수 편함 새 필터 추가 시 함수 하나만 추가
*Null 자동 무시 where()에서 null predicate은 skip

심화 예시 (AND / OR 조합)

private BooleanExpression cityEqOrIsNull(String city) {
    return city != null ? QMember.member.city.eq(city) : QMember.member.city.isNull();
}

private BooleanExpression complexCondition(String name, String city) {
    return nameEq(name).and(cityEqOrIsNull(city));
}

public List<Member> search(MemberSearchCond cond) {
    return queryFactory
        .selectFrom(QMember.member)
        .where(complexCondition(cond.getName(), cond.getCity()))
        .fetch();
}