.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();
}
'JAVA' 카테고리의 다른 글
| 상속 extends 와 규약 interface 의 차이 (0) | 2025.11.12 |
|---|---|
| abstract 추상 클래스 or 추상 메서드 (0) | 2025.11.12 |
| Logger , LoggerFactory 를 사용하는 이유 (0) | 2025.11.12 |
| @Configuration 과 xml 과 yml 설정 파일의 차이 (1) | 2025.11.12 |
| @SuppressWarnings 어노테이션 (0) | 2025.11.12 |