1. 성능 최적화를 위해 DB에서 필요한 데이터만 가져올 수 있는 DTO를 생성합니다.
@Data
public class MemberTeamDto{
private Long memberId;
private String username;
private int age;
private Long teamId;
private String teamName;
public MemberTeamDto(){
}
@QeuryProjection
public MemberTeamDto(Long memberId, String username, int age, Long teamId, String teamName){
this.memberId = memberId;
this.username = username;
this.age = age;
this.teamId = teamId;
this. teamName = teamName;
}
- 1.
@QueryProjection
Q-Type을 만들기 위한 어노테이션
2. 동적 쿼리에 사용할 검색 조건 클래스 생성
@data
public class MemberSearchCondition{
private String username;
private String teamName;
private Integer ageGoe;
private Integer ageLoe;
}
3. Repository 에 Builder를 이용한 동적 쿼리 메서드 구현
public List<MemberTeamDto> searchByBuilder(MemberSearchCondition condition){
BooleanBuilder builder = new BooleanBuilder();
if( StringUtils.hasText(condition.getUsername())){
builder.and(member.username.eq(condition.getUsername)));
}
if( StringUtils.hasText(condition.getTeamName())){
builder.and(team.name.eq(condition.getTeamName()));
}
if( condition.getAgeGoe() != null ){
builder.and(member.age.goe(condition.getAgeGoe()));
}
if( condition.getAgeLoe() != null ){
builder.and(member.age.loe(condition.getAgeLoe()));
}
return queryFactory
.select(new QMemberTeamDto(
member.id.as("memberId"),
member.username,
member.age,
team.id.as("teamID"),
team.name.as("teamName")))
.from(member)
.leftJoin(member.team,team)
.where(builder)
.fetch();
- StringUtils.hasText 를 이용하여 null 과 빈문자 체크("") (null or "" 이라면 false)
- StringUtils.hasText 를 이용하여 null 과 빈문자 체크("") (null or "" 이라면 false)
- ageGoe 가 null 인지 체크
- ageLoe 가 null 인지 체크
- 1,2,3,4 : true 일 경우 builder 에 and 조건 추가
- where 문에 builder 적용