Spring/SpringDataJPA 23

벌크성 수정 쿼리(error 해결중)

JPA는 엔티티를 가져와서 데이터를 변경하면 변경감지를 해서 엔티티를 하나하나 조회해서 값을 바꾸면 transaction commit 시점에 얘가 바꼇네 하고 update query로 db에 날라간다.(이거는 한건 한건씩 날라가는거) 스프링 데이터 JPA는 한번에 update query를 날릴 수가 있다. 예를 들어 모든 직원의 연봉을 10% 인상하라는 내용은 하나씩 update 하는거 보다는 db에다가 update query를 +10%해서 한번에 commit하는게 효율적이다. 먼저 순수 JPA로 회원의 나이를 변경하는 쿼리를 짜보자. 이 부분에서 inline이 되지 않는다. 해결중(20:20) (20:22분) MemberJpaRepository resultCount에다가 커서를 두고 Inline을 해줘..

스프링 데이터 JPA 페이징과 정렬

아래 인터페이스 2개로 공통화를 시켰는데 페이징을 공통화 시켰다고 할 수 있다.(Sort와 Pageable 두개로) 또 아래와 같이 특별하게 반환 타입을 지정해줘서 표준화를 해줄수가 있다. Page =>(totalCount와 contents 둘다 같이 가져와주고) page index는 0부터 Slice => (contents만 가져와줘서 +1 해준다.) 스프링 데이터 JPA 작성을 위해서 아래와 같이 MemberRepositoryTest를 작성을 해주고 @Test public void paging() { memberRepository.save(new Member("member1", 10)); memberRepository.save(new Member("member2", 10)); memberReposit..

순수 JPA 페이징과 정렬

검색 조건: 나이가 10살 정렬 조건은 이름으로 내림차순 페이징 조건: 첫 번째 페이지, 페이지당 보여줄 데이터는 3건으로 나타낼 수 있다. MemberJPARepository에서 아래와 같은 코드를 짜보면 public List findByPage(int age, int offset, int limit) { em.createQuery("select m from Member m where m.age = :age order by m.username desc") .setParameter("age", age) .setFirstResult(offset) .setMaxResults(limit) .getResultList(); } JPQL만 짜놓으면 현재 db에 맞는 SQL 쿼리를 날려서 db에서 페이징을 해온다. ..

반환 타입

스프링 데이터 JPA에는 다양한 반환타입이 존재한다. MemberRepository Interface에 아래와 같이 3개의 반환타입을 만들 수가 있다. List findListByUsername(String username); // 컬렉션 Member findMemberByUsername(String username); // 단건 Optional findoptionalByUsername(String username); // 단건 Optional MemberRepositoryTest @Test public void returnType() { Member m1 = new Member("AAA", 10); Member m2 = new Member("BBB", 20); memberRepository.save(m..

@Query, 값, DTO 조회하기 & 파라미터 바인딩

@Query를 넣어서 단순한 값을 조회하는 코드를 작성해보자. MemberRepository public interface MemberRepository extends JpaRepository { List findByUsernameAndAgeGreaterThan(String username, int age); List findTop3HelloBy(); List findByUsername(@Param("username") String username); @Query("select m from Member m where m.username = :username and m.age = :age") List findUser(@Param("username") String username, @Param("age") ..

JPA NamedQuery

Member Class에 있는 Entity에다가 아래와 같이 작성을 해주고 @Entity @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) @ToString(of = {"id", "username", "age"}) @NamedQuery( name="Member.findByUsername", query="select m from Member m where m.username = :username" ) MemberJpaRepositoryTest를 createNamedQuery를 이용해서 Member에서 정의한 걸 가지고 온다. "Member.findByUsername" // MemberJpaRepository class public Lis..

메소드 이름으로 쿼리 생성

스프링 데이터 JPA는 먼저 메소드 이름으로 쿼리를 생성해준다. 순수한 JPA로 몇 살 이상인지를 판단하는 쿼리를 짜보면 아래와 같다. public List findByUserNameAndAgeGreaterThen(String username, int age) { return em.createQuery("select m from Member m where m.username = :username and m.age > :age") .setParameter("username", username) .setParameter("username", username) .getResultList(); } MemberJpaRepositotryTest에서 테스트 코드를 작성해보면 Member Class에서 construc..

공통 인터페이스 분석

MemberRepository Interface의 정체는 무엇인가? package study.datajpa.repository; import org.springframework.data.jpa.repository.JpaRepository; import study.datajpa.entity.Member; public interface MemberRepository extends JpaRepository { } JpaRepository를 눌러서 열어보게 되면 여러가지 메서드가 나오게 된다.(spring-data-jpa library에 존재) 그리고 위에 패키지명을 보게되면 jpa.repository라고 되어있다. package org.springframework.data.jpa.repository; Pagi..

공통 인터페이스 설정 & 적용

MemberRepository는 아래와 같고 testcase로 가보자. package study.datajpa.repository; import org.springframework.data.jpa.repository.JpaRepository; import study.datajpa.entity.Member; public interface MemberRepository extends JpaRepository { } MemberRepositoryTest에서 System.out.println("memberRepository = " + memberRepository.getClass()); 찍어보면 package study.datajpa.repository; import org.assertj.core.api.Ass..