JPA 20

[QueryDsl] 서브쿼리 사용하기

앞서서, 서브쿼리 사용시 생각해야할 점 현재 from절에서 서브쿼리가 불가능하다. 원인 JPA JPQL에서 from 절의 서브쿼리를 지원하지 않기 때문에, JPQL 기반의 QueryDsl도 지원되지 않는다. 하이버네이트 구현체를 사용하면(JPAExpressions) select절의 서비 쿼리는 지원한다. from절의 서브쿼리 해결 방안 3가지로는 서브쿼리를 join으로 변경 시도 app에서 쿼리를 분리해서 2번 실행하여 거름 nativeSQL을 사용하기 💢그러나 from절에서 서브쿼리를 사용하는 많은 이유 두 가지는 화면에 완전 Fit하게 가져오기 위해 성능상의 이유로 단 한번의 query만 날려 가져오게 하기 위해 정도로 구분할 수 있는데, 과연 DB에서 순수하게 Data를 가져오는 역할을 시켜서 재사..

스프링/QueryDsl 2022.03.10

[QueryDsl] Join + On절 + Fetch join

기본적인 상관관계 Entity Join 기본적인 queryDsl 객체를 사용한 join 사용법 publicQ leftJoin(EntityPathtarget, Pathalias) join을 걸고싶은 Entity의 연관관계 대상과 alias를 적어준다. (물론 QueryDsl의 Q객체들) member.team처럼 내부 선언 연관관계 대상을 join에 적어주면 알아서 Team Table에서 outerJoin한다. /** * * Team A에 속한 모든 회원을 leftjoin하는 방법. */ @Test public void join() throws Exception { List result = queryFactory .selectFrom(member) .leftJoin(member.team, team) .whe..

스프링/QueryDsl 2022.03.08

[QueryDsl] 정렬, 페이징, Tuple을 이용한 특정 값 Select (max,min,avg,sum 등)

QueryDsl 정렬 예시 나이가 100살의 멤버중, 나이로 내림차순, 이름으로 올림차순인데 null이 마지막으로 뽑기 null을 먼저 뽑는 것도 있다. nullsFirst() /** * 회원 정렬 * 1. 회원 나이 내림차순(desc) * 2. 회원 이름 올림차순(asc) * 단 2에서 회원 이름이 없으면 마지막에 출력(nulls last) 대박 */ @Test public void sort() throws Exception { List result = queryFactory.selectFrom(member) .where(member.age.eq(100)) .orderBy(member.age.desc(), member.username.asc().nullsLast()) .fetch(); /* select..

스프링/QueryDsl 2022.03.06

[Querydsl] 다양한 Fetch 결과 받아보기

기본 fetch //fetch List fetch = queryFactory .selectFrom(member) .fetch(); 단건 조회 fetchOne //fetchOne queryFactory .selectFrom(member) .fetchOne(); 다건이지만, 처음 것만 가져오기 fetchFirst //fetchFirst queryFactory .selectFrom(member) .fetchFirst(); 페이징,count 포함 fetchResults //fetchResult 페이징,count 포함 QueryResults pagingResult = queryFactory .selectFrom(member).limit(5).offset(0) .fetchResults(); pagingResult...

스프링/QueryDsl 2022.03.05

[QueryDsl] QueryDsl 기본 사용법, 검색 유형별 예시

JPAQueryFactory(EntityManager)로 query를 만든다. 기존 JPQL로 제작할 때, @Test public void startJPQL() throws Exception { //member1을 찾아라 Member findByJPQL = em.createQuery("select m from Member m where m.username = :username", Member.class) .setParameter("username", "member1") .getSingleResult(); assertThat(findByJPQL.getUsername()).isEqualTo("member1"); }QueryDsl을 도입하게 되면? java로 쿼리를 실행시킬 수 있어, Runtime때 오류를 ..

스프링/QueryDsl 2022.03.05

[QueryDsl] QueryDsl 설정방법

QueryDsl 설정방법 QueryDsl은 기존 dependency들을 추가하는 경우와 다르게 설정파일들을 조금 손봐줘야한다. 최신 스프링5 버전에서 사용하기 위해 설정하지 않으면 Unable to load class 'com.mysema.codegen.model.Type' compileQuerydsl 에러가 난다. plugin 추가 라이브러리 추가 각종 dir, config ************************************************************** buildscript { ext { queryDslVersion = "5.0.0" } } *************************************************************** plugins {..

스프링/QueryDsl 2022.03.03

Query By Example 간단 예제, 사용

이번 스프링에서 밀어주는 query 탐색법이다. Entity를 생성해서 Example 객체로 변환, repository로 찾아버림 JPA Repository findAll과 같은 메서드에 이미 Example 버전을 만들어 놨다. (left join이 안되어서 실무에선 주로 QueryDsl을 사용한다.) 버전 1. 그냥 Entity객체 생성해서 실행 @Test public void queryByExampleTest() throws Exception { //given Team teamA = new Team("teamA"); Member m1 = new Member("m1",0,teamA); Member m2 = new Member("m2",0,teamA); em.persist(teamA); em.persis..

스프링/JPA 2022.03.01

`SpringDataJPA` 기본 save 작동 과정 (merge와 persist를 중심으로 효율성 개선)

기본적으로 SpringDataJPA의 기본 구현체인 save는 새로운 엔티티면 저장(persist) 기존에 있으면 (db에서 한번이라도 퍼올렸던 경험) merge를 한다. SimpleJpaRepository의 save 메서드 모습. @Repository @Transactional(readOnly = true) public class SimpleJpaRepository implements JpaRepositoryImplementation { @Transactional @Override public S save(S entity) { Assert.notNull(entity, "Entity must not be null."); if (entityInformation.isNew(entity)) { em.persi..

스프링/JPA 2022.02.27

API 구현시 Parameter로 자동 Paging 객체 매핑하기

Pageable 인터페이스를 구현체로 SpringDataJPA의 기능을 이용해 SpringBoot가 Parameter로 PageRequest라는 객체를 생성을 해서 구현을 해준다. //마지막 파라미터로 Pageable 인터페이스 받아서 쓰면 된다. //파라미터 Page 넘기면 자동으로 Mapping, Paging @GetMapping("/members") public Page list(Pageable pageable){ return memberRepository.findAll(pageable); } 페이징을 위해 Pageable을 받는 findAll이 PagingAndSortingRepository에 구현되어있다.(Data JPA) @NoRepositoryBean public interface Pagin..

스프링/JPA 2022.02.25

Entity를 변경/생성할 때, 변경자와 시간 히스토리 관리하려면?

순수 JPA로 하는 법 @MappedSuperclass 를 선언한 속성값 선언용 Class를 만들어 Entity에서 상속받게 하라. MappedSuperclass 생성, 변수 선언 @MappedSuperclass //실제 상속관계는 아니고 그냥 값만 내려서 사용할 수 있게 해주는 class //이걸 선언해야 이후 상속한 Entity Table 생성시 변수값이 추가된다. public class JpaBaseEntity { @Column(updatable = false) //DB의 값이 변경되지 않게 고정해주는 어노테이션 private LocalDateTime createdDate; private LocalDateTime updatedDate; @PrePersist //persist (등록) 하기전에 발동 ..

스프링/JPA 2022.02.24
1 2