


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(방언)에 등록된 내용만 호출할 수 있다.

어... 잘 모르겠다.