
📘QueryDSL 초기 설정 및 사용법
//쿼리문에 문제가 있어도 컴파일은 실행된다.
String query = "SELECT u FROM User u WHERE u.username = :username";QUser user = QUser.user; //QueryDSL 에서 자동 생성하는 클래스
User result = queryFactory
.selectFrom(user)
.where(user.username.eq(dto.getUsername())) //eq : Equal
.fetchOne();BooleanBuilder where = new BooleanBuilder();
// 날짜에 대한 동적 쿼리
LocalDateTime start = dto.getStartDate();
LocalDateTime end = dto.getEndDate();
if (start != null && end != null) {
where.and(log.createdAt.between(start, end)); // 시작, 종료 모두 있을 경우
} else if (start != null) {
where.and(log.createdAt.goe(start));// 시작일만 있을 경우 (시작일 ~ 끝)
} else if (end != null) {
where.and(log.createdAt.loe(end)); // 종료일만 있을 경우 (처음 ~ 종료일)
}
List<Log> findList = queryFactory
.selectFrom(log)
.where(where)BooleanBuilder 생성 후 조건에 따라 추가해준다.where 조건에 추가해준다.// Querydsl 추가 (Spring boot 3.x 이상)
implementation 'com.querydsl:querydsl-jpa:5.1.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:5.1.0:jakarta" //Q클래스
annotationProcessor "jakarta.annotation:jakarta.annotation-api"//어노테이션
annotationProcessor "jakarta.persistence:jakarta.persistence-api"//어노테이션./gradlew clean build
@Entity 클래스를 기준으로 생성되는 쿼리 전용 클래스QClass 의 구조는 Entity 와 다를 것이 없는데, 따로 생성하는 이유는?

public interface LogRepository extends JpaRepository<Log, Long>, LogSearchRepository {
}
LogSearchRepository 쿼리 추가용 인터페이스public interface LogSearchRepository {
Page<Log> findAllFromQueryDsl(LogRequestDto logRequestDto, Pageable pageable);
}
@Repository
@RequiredArgsConstructor
public class LogRepositoryImpl implements LogSearchRepository{
private final JPAQueryFactory queryFactory;
@Override
public Page<Log> findAllFromQueryDsl(LogRequestDto dto, Pageable pageable) {
// 쿼리 작성
}
@RequiredArgsConstructor
public class UserRepositoryImpl implements UserRepositoryCustom {
private final JPAQueryFactory queryFactory;
@Override
public List<User> search(String name, UserRoleEnum role) {
QUser user = QUser.user;
return queryFactory
.selectFrom(user)
.where(
name != null ? user.name.eq(name) : null,
role != null ? user.role.eq(role) : null
)
.fetch();
}
}
name이나 role이 null이면 자동으로 제외| 조건식 | 의미 |
|---|---|
eq() | 같다 |
ne() | 같지 않다 |
gt() | 초과 (>) |
lt() | 미만 (<) |
goe() | 이상 (>=) |
loe() | 이하 (<=) |
contains() | 포함 (LIKE %값%) |
startsWith() | 시작하는 문자열 |
endsWith() | 끝나는 문자열 |
//기본적으로 where() 안의 조건은 AND
.where(user.name.eq("karina"), user.role.eq(UserRoleEnum.USER))
//OR 조건 사용
.where(user.name.eq("karina").or(user.name.eq("winter")))