-
[링크] Predicate, BooleanExpression의 개념과 차이점Stack/Java 2022. 12. 29. 07:57
Predicate, BooleanExpression 개념
뭐냐
BooleanExpression 클래스는 자바8 문법이다. 조건문을 담을 수 있고, 담은 조건문을 다른 곳에서 활용할 수 있다.
왜쓰냐
조건문이 null일수도 있다. 단순 Builder를 쓰면 문법도 보기 좋지 않고 무슨 조건절인지 한눈에 파악이 어렵다.
BooleanBuilder builder = new BooleanBuilder();
if(XxxRepository.getMemberId() != null) {
builder.and(....)
}
이런식으로 BooleanBuilder에 조건절을 if문을 통해서 하나하나 검사하고, and 메서드로 조건절들을 추가한다. 그리고 완성된 BooleanBuilder를 쿼리문의 조건절에 넣는데, 조건이 복잡하고 경우의 수가 많으면 작업량도 많고 이해도 어려울 것이다. A B 2개 조건에 대해 검사한다고만 생각하더라도, (A 참, B 거짓), (A 거짓, B 참), (A 참, B 참), (A 거짓, B 거짓)의 경우를 다 검사해야할지도 모른다..
어떻게 쓰냐
예를들어, 아래와 같이 JPA의 where 절에서 BooleanExpression 또는 Predicate[] 을 쓸 수 있다. 21번줄의 makeExpressions의 where절은 조건들이 null이 아닐때는 where절을 적용하지만, 조건들이 null 일때는 21번줄 where절을 무시할 수 있다.
1234567891011121314151617181920212223public BooleanExpression[] makeExpressions(List<Long> memberIdList, Integer statusCode) {return new BooleanExpression[]{xxxEntity.wId.in(wIds), xxxEntity.statusCode.ne(xxxStatus.DELETE.getCode()), (xxxEntity.bId.notIn(Bxx.getbId()).or(xxxEntity.bId.isNull()))};}...QueryResults<XxxDto> results = jpaQueryFactory.select(....).from( ... ).where(makeExpressions).where(기본 조건문들).fetch();cs Predicate, BooleanExpression 차이
BooleanExpression은 Predicate의 구현체이다. 참조1)에 따르면 BooleanExpression은 null 일때 무시될 수 있고, and또는 or절을 통해서 조합을 할 수 있다. Predicate는 단순 true or false 조건문 정도에 사용하는 걸로 생각된다. 성능에 차이가 있을지도 모르겠다..
'Stack > Java' 카테고리의 다른 글
JAVA Stream API 복습(1) (0) 2023.05.14