Predicate는 쉽게 말해 '이 조건이 맞다'고 판단하는 근거를 함수로 제공하는 것이다.
함수형 패러다임을 가진 언어들에서 자주 사용되는데, Java 8 버전에도 포함되어 있다.
Repository에서 Predicate를 파라미터로 전달하기 위해서는 QueryDslPredicateExcutor<T> 인터페이스를 Repository에 추가해 주어야만 한다.
메서드 | 설명 |
long count(Predicate) | 데이터의 전체 개수 |
boolean exists(Predicate) | 데이터의 전제 여부 |
Rerable<T> findAll(Predicate) | 조건에 맞는 모든 데이터 |
Page<T> findAll(Predicate) | 조건에 맞는 모든 데이터 |
Iterable<T> findAll(Predicate, Sort) | 조건에 맞는 모든 데이터와 정렬 |
T findOne(Predicate) | 조건에 맞는 하나의 데이터 |
Repository 변경
Repository 인터페이스는 QueryDslPredicateEXecutor<T> 인터페이스를 상속하도록 추가해 주어야 한다.
org.zerock.persistence.BoardRepository.java |
public interface BoardRepository extends CrudRepository<Board, Long>, QuerydslPredicateExecutor<Board>{
Predicate 생성 및 테스트
Predicate는 단어적 의미로 단언하다, 확신하다의 의미로, 프로그램적 으로 boolean으로 리턴되는 결과 데이터를 만들어야 한다. 주로 BooleanBuilder를 이용해 생성하는데 사용방법은 테스트 코드를 통해 알아본다.
org.zerock.BootApplicationTests.java |
...
import com.querydsl.core.BooleanBuilder;
@RunWith(SpringRunner.class)
@SpringBootTest
class Boot03ApplicationTests {
...
@Test
public void testPredicate() {
String type = "t";
String keyword = "17";
BooleanBuilder builder = new BooleanBuilder();
QBoard board = QBoard.board;
if(type.equals("t")) builder.and(board.title.like("%" + keyword + "%"));
// bno > 0
builder.and(board.bno.gt(0L));
Pageable pageable = PageRequest.of(0, 10);
Page<Board> result = repo.findAll(builder, pageable);
System.out.println("PAGE SIZE: " + result.getSize());
System.out.println("TOTAL PAGES: " + result.getTotalPages());
System.out.println("TOTAL COUNT: " + result.getTotalElements());
System.out.println("NEXT: " + result.nextPageable());
List<Board> list = result.getContent();
list.forEach(b -> System.out.println(b));
}
}
결과 |
Hibernate: ...
board0_ where (board0_.title like ? escape '!') and board0_.bno? limit ?
Hibernate: ...
where(board0_.title like ? escape '!') and board0_.bno>?
PAGE SIZE: 10
TOTAL PAGES: 4
TOTAL COUNT: 36
NEXT: Page request [number: 1, size 10, sort: UNSORTED]
... 테이블 결과 내용 ...
리턴 타입을 Page<T>로 설정했기 때문에 데이터를 추출하는 SQL과 개수를 파악하는 SQL이 실행되고, 이때 필요한 조건들이 지정되는 것을 볼 수 있다.
'Starter SpringBoot 2.x 보충 내용' 카테고리의 다른 글
JPA Paging(페이지 나누기) (0) | 2021.08.30 |
---|