3가지 방법
Projections.bean
을 통해 접근한다.
MemberDto
에는 setter
가 있어야 한다.setter
가 없으면 모든 값이 null
또는 0
으로 세팅됨.@NoArgsContructor
)Projections.fields
를 통해 직접 데이터를 주입한다.
setter
가 없어도 된다.null
또는 0
으로 세팅됨.참고
필드가 맞지 않더라도, member.username.as("name")
과 같이 설정해주면, fields
를 사용해도 값을 잘 가져온다.
age
값을 어떤 값으로 고정하고 싶다면, 위와 같이
JPAExpressions
로 서브멤버를 이용하여 고정이 가능하다.
Projections.constructor
setter
가 없어도 된다.DTO
에 생성자 부분에 @QueryProjection
를 넣고,
Gradle
에서 compileQuerydsl
을 실행하게 되면,
QMemberDto
가 빌드에서 생성된다.
그럼 이와 같이 쓰면 값을 넣어줄 수 있다.
가장 안정적인 방법이다.
하지만, DTO
에 Querydsl
을 의존해야한다는 점과, Q파일
을 생성해야한다는 단점을 가지고 있다.
이를 감안한다면 유용하게 사용할 수 있다. 선택을 해서 사용할 것.
where
문에 넣을 조건들을 BooleanBuilder
를 통해 통째로 만든다음에 넣어주는 방식이다.
값이 둘다 있다면, 둘 다 검색 조건에 들어가고, 하나만 들어가면 하나만 검색 조건에 들어간다. 둘다 없으면 그냥 조건없이 검색이 된다.
실무에서 정말 자주 사용한다고 하심
where
조건에 null
값은 무시된다.이와 같이 조합도 가능하다. 다만 null
체크를 주의해서 처리해야한다.
em.flush()
를 하기 전에는 DB로 연산을 보내지 않으므로,
em.flush()
없이 조회를 하게 되면, 이전 값이 조회되서 나오게 된다.
그러므로 수정을 한 뒤에는 꼭 em.flush()
, em.clear()
를 하자.
모든 나이에 1씩 더하는 방법이다.
빼기의 경우 add(-1)
이런식으로 작성하면 된다.
삭제하는 방법이다. 위 내용을 보면 18세 이상의 모든 회원을 지우는 것이다.
SQL function
은 JPA와 같이 Dialect
(방언)에 등록된 내용만 호출할 수 있다.
어... 잘 모르겠다.