본문으로 건너뛰기

Q Class Usage (Specification Support)

Overview

ElastiCORE는 엔티티 정의를 기반으로 Q 클래스를 자동 생성합니다. Q 클래스는 필드 기준으로 JPA Specification 조건을 명시할 수 있는 타입 세이프한 빌더입니다.

Basic Usage

Specification<Entity> spec = Q.Entity.name(Op.LIKE, "test")
.and(Q.Entity.createdAt(Op.GTE, startDate, true));

Supported Operators (Op)

연산자설명예시
Op.EQUAL정확 일치Q.User.status(Op.EQUAL, "ACTIVE")
Op.LIKE부분 일치Q.User.name(Op.LIKE, "홍")
Op.IN다중 값Q.User.role(Op.IN, roleList)
Op.GT초과Q.User.age(Op.GT, 20)
Op.GTE이상Q.User.age(Op.GTE, 18)
Op.LT미만Q.User.age(Op.LT, 65)
Op.LTE이하Q.User.age(Op.LTE, 60)

Condition Combination

AND Combination

Specification<User> spec = Q.User.name(Op.LIKE, "홍길동")
.and(Q.User.status(Op.EQUAL, "ACTIVE"))
.and(Q.User.age(Op.GTE, 20));

OR Combination

Specification<User> spec = Q.User.name(Op.LIKE, "홍길동")
.or(Q.User.email(Op.LIKE, "hong"));

Practical Usage Example

@Service
public class UserService {

@Autowired
private UserRepository userRepository;

public Page<User> searchUsers(UserSearchDTO searchDTO) {
Specification<User> spec = Specification.where(null);

if (searchDTO.getName() != null) {
spec = spec.and(Q.User.name(Op.LIKE, searchDTO.getName()));
}
if (searchDTO.getStatus() != null) {
spec = spec.and(Q.User.status(Op.EQUAL, searchDTO.getStatus()));
}

return userRepository.findAll(spec, searchDTO.getPageable());
}
}

Q Class Generation Location

Q 클래스는 env.yml의 namespace 설정에 따라 생성됩니다:

q: io.domain.q

생성 명령:

./gradlew elcore