https://www.inflearn.com/course/Querydsl-%EC%8B%A4%EC%A0%84
※ 중급 문법
ㅁ 프로젝션과 결과 반환 - 기본
- tuple은 여러개의 칼럼을 닮기 위한 자료형 (com.querydsl.core 패키지 안에 있음)
- tuple은 repository에서만 사용하는게 베스트 (다른 계층에서 사용하지 않도록, 의존하지 않게 하는것 권장)
> dto로 바꿔서 전달하자
ㅁ 프로젝션과 결과 반환 - DTO 조회
- 1. setter 사용
> Projections.bean(MemberDto.class, member.username, member.age) 로 진행
> dto에 기본 생성자 필요 , 기본생성자 통해 생성 후, setter를 통해 주입
> 프로퍼티 명이 완전히 같아야함
- 2.filed
> Projections.fields(MemberDto.class, member.username, member.age) 로 진행
> 기본 생성자 및 setter 필요 없음
> 필드 명이 완전히 같아야함
>>. member.username.as("name") 로 해결
>> ExpressionUtils.as( ~~~ , "aliaa") 로 해결
- 3. constructor
> Projections.constructor(MemberDto.class, member.username, member.age) 로 진행
> 파라미터의 타입을 잘 맞춰야함
ㅁ 프로젝션과 결과 반환 - @QueryProjection
- dto의 생성자에 @QueryProjection을 달아준다.
- 컴파일시 q객체가 생겨나며, new DTO()로 바로 프로젝션할 수 있다.
- 단점은 컴파일시 에러를 찾을 수 없다. (런타임 오류로 확인남), q파일을 생성해야함
dto가 QueryProjection을 querydsl로 부터 import해야해서 의존성이 추가됨
ㅁ 동적쿼리 - BooleanBuilder 사용
- builder 도 and, or 조건 가능
- 생성자에 기본으로 꼭 들어가야할 조건도 설정 가능
private List<Member> searchMember1(String usernameCond, Integer ageCond) {
BooleanBuilder builder = new BooleanBuilder();
if(usernameCond != null){
builder.and(member.username.eq(usernameCond));
}
if(ageCond != null){
builder.and(member.age.eq(ageCond));
}
return queryFactory
.selectFrom(member)
.where(builder)
.fetch();
}
ㅁ 동적 쿼리 - where 다중 파라미터 사용
- 메소드 생성을 통해 Predicate ( or BooleanExpression) 반환
> null 일 경우, where( null, ) 처리를 통해 처리 가능
- 조합을 할 수도 있다.
> 굉장히 큰 장점임
- 쿼리 자체의 가독성이 높아짐
- null 체크는 주의해서 처리해야함
ㅁ 수정, 삭제 배치 쿼리
- 업데이트 후, 영속성 컨텍스트가 우선권이 있기 때문에 clear 후 재조회해야함
- 속성 업데이트 같은 경우 아래와 같이 진행 ( multiply도 가능 )
long count = queryFactory
.update(member)
.set(member.age, member.age.add(1))
.execute();
ㅁ SQL function 호출하기
- dialect 설정하여 함수를 호출할 수 있음
-Expressions.stringtemplate("function~~) 으로 설정
- ansi 표준에 정의된 함수 (ex) lower)는 아래와 같이 호출 가능
// .where(member.username.eq(Expressions.stringTemplate("function('lower',{0})", member.username)))
.where(member.username.eq(member.username.lower()))
'Spring' 카테고리의 다른 글
[Spring] ThymeLeaf 정리 - 1 (0) | 2021.11.22 |
---|---|
[Spring] 실전! Querydsl - 3 (0) | 2021.09.13 |
[Spring] 실전! Querydsl - 1 (0) | 2021.09.09 |
[Spring] 실전! 스프링 데이터 JPA - 3 (0) | 2021.09.06 |
[Spring] 실전! 스프링 데이터 JPA - 2 (0) | 2021.09.03 |