자바/JPA

Querydsl 기능 (2)

류창 2022. 7. 27. 22:51
반응형

 

 

 

Querydsl 서브쿼리 작성법이다.

 

 

서브쿼리를 작성하는법은 기존 네이티브SQL과 흡사하다.

 

 

 

 

Querydsl의 Case작성방법이다.

 

간단한 Case문은  when()에다 조건문을,  then() 에 결과를 넣으면된다.

 

그 밖의 결과값은 otherwise()를 사용한다.

 

 

좀더 복잡한 쿼리를 작성하고싶을땐

 

CaseBulder를 사용한다.  

 

CaseBuilder에는   between , gt, goe , lt, lot ,  ne , in, notin 등등 다양한 조건에대해 결과값을 넣어줄수있다.

 

 

 

 

 

 

쿼리dsl에서   고정적인 문자값 또는 상수값을 넣고싶다면   Expressions.constant()를 사용하자.

 

 

또한   조회한 값에 추가로 문자열을 붙이고싶다면  concat()을 사용하요 덧붙히면된다.

 

 

 

이 Querydsl의 기능은   만들어놓은 Dto를 조회하여 데이터를 넣어 반환하는용이다. 

 

이런 기능을 쓰는이유는  

 

Member클래스의 다양한 변수 2~30개가 존재한다고 가정한다면 

 

거기서 필요로 뽑고싶은변수가 3개만 필요하다면 따로 dto를 작성하여 넣자.

 

만약 dto를 작성안한다면  쓸일도없는 나머지 17개의 멤버를 조회해서 가져오는일이 된다. 

 

쓰지도 않을 변수를 괜히 조회하면 낭비가 되니간 이렇게 최적화 Dto를 조회해서  사용한다. 

 

 

Dto를 조회하는데는 4가지 방법이있다.

 

1. Setter 사용 (setter메소드로  bean 주입)

 

2. fileds 사용 ( dto클래스 내부에있는 필드에 바로 주입)

 

3.생성자 사용 (constructor로 주입)

 

4, @QueryProjection 사용

 

 

 

@QueryProjection 을 사용하려면,

 

해당 Dto 생성자에  @QueryProjection을 작성하자. 

 

작성한뒤 컴파일을하면,  Entity와 마찬가지로 Q-Type으로 dto를 생성해준다.

 

그 dto를 사용하면된다.

 

 

QueryDsl은 동적 쿼리를 조합할수있다.

 

BooleanBuilder를 통해   동적으로 바뀌는 조건을 작성할수있다.

 

간단하게  builder를 하나 생성하고  원하는 조건을  and()를 사용해 계속 추가해가면 된다.

 

 

 

 

BooleanBuilder를 사용하는 방법이 조금 보기가 깔끔하지가 않는다면, 

 

BooleanExpression을 사용하여 깔끔하게 바꿀수가 있다.

 

보기에 작성한  allEq2() 메소드를 까보면..

 

builder로  조건을 묶어놨다.

 

BooleanBuilder말고  BooleanExpression을 써도 되지만,

 

BooleanExpression 같은경우는  첫 파라미터가 Null일경우  NPE 에러가 뜬다.

 

물론, 이 NPE에러는  Null 조건을 피하는 코드를 따로 작성하면 되지만, 오히려 조금더 복잡해지고

보기도안좋다 그냥 BooleanBuilder로 Expression들을 묶어서 반환하는게 제일 깔끔하고 Null케어도 되는것 같다.

 

 

 

 

builder로  추가한   usernameEq , teamNameEq,  ageGoe 들은 전부 BooleanExpression이다.

 

 

이 메소드들을 한번 까보면,

 

전부 다 BooleanExpression으로 구현이되어있다. 

 

간단하게  BooleanExpression으로 조건식 을 함축시킨것이다.

 

 

 

반응형

'자바 > JPA' 카테고리의 다른 글

JPA Entity 정적 팩토리 메소드에 관하여  (1) 2022.09.19
Querydsl 기능 (1)  (0) 2022.07.27
스프링 JPA Querydsl 소개  (0) 2022.07.25
JPA 값타입  (0) 2022.06.27
JPA : 상속관계 매핑  (0) 2022.06.15