[JPA - Querydsl] BooleanBuilder란 무엇인가? ( 동적쿼리, 정적쿼리 )
간단하게 말하면
쿼리의 조건 설정인 where뒤의 조건을 생성해주는 것이라고 생각하면 된다.
예제
예제 조건
- name이 오면 where name = name
- address가 오면 where address = address
- phoneNumber가 오면 where phoneNumber = phoneNumber
- 2개 이상이 오면 모두 포함 where name = name and address = address and phoneNumber = phoneNumber
기존 사용 방법, BooleanBuilder를 사용할 시 - 정적 쿼리
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
@Override
public List<Academy> findDynamicQuery(String name, String address, String phoneNumber) {
BooleanBuilder builder = new BooleanBuilder();
if (!StringUtils.isEmpty(name)) {
builder.and(academy.name.eq(name));
}
if (!StringUtils.isEmpty(address)) {
builder.and(academy.address.eq(address));
}
if (!StringUtils.isEmpty(phoneNumber)) {
builder.and(academy.phoneNumber.eq(phoneNumber));
}
return queryFactory
.selectFrom(academy)
.where(builder)
.fetch();
}
|
위의 코드를 보면 기존의 iBatis나 myBatis에서 사용하던것과 유사한 것을 볼 수 있을 것이다.
if문으로 필요한 부분만을 BooleanBuilder에 추가하면서 쿼리를 만든 형태이다.
하지만, 단점이 있는데 where문의 조건들이 한눈에 보기 어렵다는 것이다.
해결 방법, BooleanExpression를 사용 추천. - 동적 쿼리
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
@Override
public List<Academy> findDynamicQueryAdvance(String name, String address, String phoneNumber) {
return queryFactory
.selectFrom(academy)
.where(eqName(name),
eqAddress(address),
eqPhoneNumber(phoneNumber))
.fetch();
}
private BooleanExpression eqName(String name) {
if (StringUtils.isEmpty(name)) {
return null;
}
return academy.name.eq(name);
}
private BooleanExpression eqAddress(String address) {
if (StringUtils.isEmpty(address)) {
return null;
}
return academy.address.eq(address);
}
private BooleanExpression eqPhoneNumber(String phoneNumber) {
if (StringUtils.isEmpty(phoneNumber)) {
return null;
}
return academy.phoneNumber.eq(phoneNumber);
}
|
'◽ JDBC > JPA & Hibernate' 카테고리의 다른 글
[Hibernate] 하이버네이트란 ppt (0) | 2021.03.18 |
---|---|
[이슈, Spring(JPA) - DB] 오류 "could not resolve property" (0) | 2019.11.01 |
[이슈, Spring(JPA) - 어노테이션(Annotation)] @Setter을 쓰지 않는 이유 (0) | 2019.10.21 |
[이슈, spring - jpa] rest api의 통신방법 통일or다중화하기. (0) | 2019.10.21 |
[JPA] Entity와 Repository의 관계, Repository의 기본 메서드/추가 메서드 (0) | 2019.10.21 |
[Spring(JPA) - 어노테이션(Annotation) ] @DynamicUpdate (0) | 2019.10.21 |
[JPA] 데이터베이스 스키마 생성(자동) 설정 - (데이터베이스 만들기(인식)) (0) | 2019.10.18 |