분류 전체보기 1341

Ch03. 중급 문법 - 수정, 삭제 벌크 연산

@Test @Commit public void bulkUpdate(){ //member1 = 10 -> DB member1 //member2 = 20 -> DB member2 //member3 = 30 -> DB member3 //member4 = 40 -> DB member4 //해당 값들이 다 영속성 컨택스에 올라가 있는 상태이다. //벌크 연산은 DB에 바로 쿼리를 동작시키기 때문에 DB와 영속성 컨택스트랑 데이터가 맞지 않는다. long count = queryFactory .update(member) .set(member.username, "비회원") .where(member.age.lt(28)) .execute(); //영속성 컨택스트에 값이 있기 때문에 DB에서 값을 가지고 와도 버리기 때문..

실전! Querydsl 2021.12.31

Ch03. 중급 문법 - 동적 쿼리(BooleanBuilder 사용)

동적 쿼리를 해결하는 두 가지 방식 BooleanBuilder Where 다중 파라미터 사용 BooleanBuilder age,username 값이 null이 올 수도 있다(동적 쿼리를 실행 시켜 주어야한다) 초깃값을 넣어 줄 수도 있고, builder에 조건을 계속 더해서 사용이 가능하다. Where 다중 파라미터 사용 where 조건에 null 값은 무시된다. 메서드를 다른 쿼리에서도 재활용할 수 있다. 쿼리 자체의 가독성이 높아진다

실전! Querydsl 2021.12.31

Ch03. 중급 문법 - 프로젝션과 결과 반환(기본, DTO 조회, @QueryProjection)

프로젝션 대상이 하나 프로젝션 대상이 하나면 타입을 명확하게 지정할 수 있음 프로젝션 대상이 둘 이상이면 튜플이나 DTO로 조회 튜플 조회 프로젝션 대상이 둘 이상일 때 사용 DTO 조회 JPQL에서의 DTO 조회 순수 JPA에서 DTO를 조회할 때는 new 명령어를 사용해야 함 DTO의 package이름을 다 적어줘야 해서 지저분함 생성자 방식만 지원함 QueryDsl bean 생성( BeanPopulation) Getter, Setter를 사용하여 값을 넣어준다. 필드 직접 접근 필드에 바로 접근하여 넣어준다(Getter,Setter 필요 X) 생성자 사용 생성자를 통해 주입해 준다(타입이 딱 맞아야된다) 별칭이 다를때 서브 쿼리를 사용하여 별칭이 다르거나, Dto의 이름과 뽑아오는 값이 다를 경우 ..

실전! Querydsl 2021.12.31

Ch02. 기본 문법 - Case문, 상수, 문자 더하기

Case 문 단순한 조건 복잡한 조건 이러한 문법이 있지만 보통은 애플리케이션 로직에서 처리해 주는 것이 좋다 DB에서 화면에 맞추어 쿼리를 반환한다기 보다는 데이터를 가지고 오는 것에 집중하고, 애플리케이션 단에서 화면에 맞춰 데이터를 가공하는 형식으로 개발해 나가야 한다 상수, 문자 더하기 참고 member.age.stringValue() 부분이 중요한데, 문자가 아닌 다른 타입들은 stringValue() 로 문자로 변환할 수 있다. 이 방법은 ENUM을 처리할 때도 자주 사용한다

실전! Querydsl 2021.12.30

Ch02. 기본 문법 - 서브 쿼리

com.querydsl.jpa.JPAExpressions 사용 서브 쿼리 eq 서브 쿼리 goe 서브쿼리 in 서브쿼리 select From 절의 서브 쿼리 한계 JPA JPQL 서브쿼리의 한계점으로 from 절의 서브쿼리(인라인 뷰)는 지원하지 않는다. 당연히 Querydsl 도 지원하지 않는다. 하이버네이트 구현체를 사용하면 select 절의 서브쿼리는 지원한다. Querydsl도 하이버네이트 구현체를 사용하면 select 절의 서브 쿼리를 지원한다. from 절의 서브쿼리 해결방안 1. 서브쿼리를 join으로 변경한다. (가능한 상황도 있고, 불가능한 상황도 있다.) 2. 애플리케이션에서 쿼리를 2번 분리해서 실행한다. 3. nativeSQL을 사용한다.

실전! Querydsl 2021.12.30

Ch02. 기본 문법 - 조인(기본 조인, On, 페치 조인)

기본 조인 기본 조인 조인의 기본 문법은 첫 번째 파라미터에 조인 대상을 지정하고, 두 번째 파라미터에 별칭(alias)으로 사용할 Q 타입을 지정하면 된다. join(조인 대상, 별칭으로 사용할 Q타입) join() , innerJoin() : 내부 조인(inner join) leftJoin() : left 외부 조인(left outer join) rightJoin() : rigth 외부 조인(rigth outer join) JPQL의 on 과 성능 최적화를 위한 fetch 조인 제공 다음 on 절에서 설명 세타 조인 연관관계가 없는 필드로 조인 from 절에 여러 엔티티를 선택해서 세타 조인 외부 조인 불가능 다음에 설명할 조인 on을 사용하면 외부 조인 가능 조인 - on절 ON 절을 활용한 조인(..

실전! Querydsl 2021.12.30

Ch02. 기본 문법 - 정렬, 페이징, 집합

정렬 desc() , asc() : 일반 정렬 nullsLast() , nullsFirst() : null 데이터 순서 부여 페이징 JPQL처럼 Offset, Limit를 통해 페이징이 가능하다. 주의: count 쿼리가 실행되니 성능상 주의! 참고 실무에서 페이징 쿼리를 작성할 때, 데이터를 조회하는 쿼리는 여러 테이블을 조인해야 하지만, count 쿼리는 조인이 필요 없는 경우도 있다. 그런데 이렇게 자동화된 count 쿼리는 원본 쿼리와 같이 모두 조인을 해버리기 때문에 성능이 안 나올 수 있다. count 쿼리에 조인이 필요 없는 성능 최적화가 필요하다면, count 전용 쿼리를 별도로 작성해야 한다. 집합 JPQL이 제공하는 모든 집합 함수를 제공한다. 그룹화된 결과를 제한하려면 having을 ..

실전! Querydsl 2021.12.30

Ch02. 기본 문법 - 검색 조건 쿼리, 결과 조회

여러 검색조건 체인 여러 가지 검색조건을 메서드 체인으로 and/or로 걸 수 있다. 추가 p6 spy 로깅 시에 파라미터 값이 null이 되는 이슈를 커뮤니티에서 발견했다, 그리고 실제로 찍어보니 NULL값이 찍히는 것이었다. /* select member1 from Member member1 where member1.age not in 201 */ select member0_.member_id as member_i1_1_, member0_.age as age2_1_, member0_.team_id as team_id4_1_, member0_.username as username3_1_ from member member0_ where member0_.age not in (30 , 40 , NULL); ..

실전! Querydsl 2021.12.30

Ch02. 기본 문법 - JPQL vs Querydsl, 기본 Q-Type 활용

JPQL 문제점 : jpql은 문자열이기 때문에 중간에 오류가 발생하여도 런타임에 잡을 수밖에 없다. QueryDsl QueryDsl로 작성하면 컴파일 시점에 문법 오류를 발견할 수 있다. EntityManager로 JPAQueryFactory 생성 Querydsl은 JPQL 빌더 JPQL: 문자(실행 시점 오류), Querydsl: 코드(컴파일 시점 오류) JPQL: 파라미터 바인딩 직접, Querydsl: 파라미터 바인딩 자동 처리 JPAQueryFactory를 필드로 제공하면 동시성 문제는 어떻게 될까? 동시성 문제는 JPAQueryFactory를 생성할 때 제공하는 EntityManager(em)에 달려있다. 스프링 프레임워크는 여러 스레드에서 동시에 같은 EntityManager에 접근해도, 트..

실전! Querydsl 2021.12.30

Ch01. 프로젝트 환경 설정 - 예제 도메인 모델과 동작확인

ERD 도메인 모델과, ERD member - team 이 일대다 관계로 양방향 연관관계를 가지고 있다. Entity Member @Entity @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) @ToString(of = {"id","username","age"}) //양방향 연관관계는 출력 X public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; private String username; private int age; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "team_id")..

실전! Querydsl 2021.12.29