사용자 정의 리포지토리 구현 스프링 데이터 JPA 리포지토리는 인터페이스만 정의하고 구현체는 스프링이 자동 생성 스프링 데이터 JPA가 제공하는 인터페이스를 직접 구현하면 구현해야 하는 기능이 너무 많음 다양한 이유로 인터페이스의 메서드를 직접 구현하고 싶다면? JPA 직접 사용( EntityManager ) 스프링 JDBC Template 사용 MyBatis 사용 데이터베이스 커넥션 직접 사용 등등... Querydsl 사용 사용자 정의 인터페이스 public interface MemberRepositoryCustom { List findMemberCustom(); } 사용자 정의 인터페이스 구현 클래스 @RequiredArgsConstructor public class MemberRepositoryI..
분류 전체보기
JPA Hint JPA 쿼리 힌트란, SQL 힌트가 아니라 JPA 구현체에게 제공하는 힌트이다. 예제) 일반적으로는 변경 감지가 일어난다. @Test public void queryHint() { //given Member member1 = new Member("member1", 10); memberRepository.save(member1); em.flush(); em.clear(); //when Member findMember = memberRepository.findById(member1.getId()).get(); findMember.setUsername("member2"); em.flush(); //변경 감지 -> Update Query 실행 } 변경 감지의 단점 원본이 있어야 변경 감지를 한다..
@EntityGraph 간단히 말하면 연관된 엔티티들을 SQL 한번에 조회하는 방법이다. 즉, 페치(fetch) 조인을 어노테이션으로 사용할 수 있다. 먼저 페치 조인 예제를 알아보자. 페치 조인 개념은 이전 글을 참고하자. 참고: https://un-lazy-midnight.tistory.com/114 JPA | JPQL 중급 문법 뿌시기 - 페치 조인(fetch join) 페치 조인 SQL 조인의 종류가 아니라 JPQL에서 성능 최적화를 위해 제공하는 기능이다. 연관된 엔티티나 컬렉션을 SQL 한 번에 함께 조회하는 기능이다. join fetch 명령어를 사용한다 엔티티 페치 조 un-lazy-midnight.tistory.com 페치 조인 예제 코드 member -> team은 지연로딩 관계이다. ..
벌크 연산에 대한 설명은 지난 글에 있다. 참고: https://un-lazy-midnight.tistory.com/115 JPA | JPQL 중급 문법 뿌시기 - 다형성 쿼리, 엔티티 직접 사용, Named 쿼리, 벌크 연산 다형성 쿼리 TYPE 조회 대상을 특정 자식으로 한정 예) Item 중에서 Book, Movie를 조회해라 [JPQL] select i from Item i where type(i) IN (Book, Movie) [SQL] select i from i where i.DTYPE in (‘B’, ‘M’) TREAT 자바의 타입 un-lazy-midnight.tistory.com 순수 JPA의 벌크성 쿼리 예제) 특정 나이 이상인 Member들의 나이를 1씩 증가시킨다. Reposito..
순수 JPA 페이징과 정렬 다음 조건으로 페이징과 정렬을 사용하는 예제 코드로 알아보자. 검색 조건: 나이가 10살 정렬 조건: 이름으로 내림차순 페이징 조건: 첫번째 페이지, 페이지당 보여줄 데이터는 3건 JPA 페이징 리포지토리 코드 public List findByPage(int age, int offset, int limit) { return em.createQuery("select m from Member m where m.age = :age order by m.username desc") .setParameter("age", age) .setFirstResult(offset) .setMaxResults(limit) .getResultList(); } public long totalCount(i..
파라미터 바인딩 위치 기반 이름 기반 (사용 권장!) select m from Member m where m.username = ?0 //위치 기반 select m from Member m where m.username = :name //이름 기반 *이름 기반 파라미터 바인딩을 권장한다. 위치 기반은 가독성도 좋지 않고 순서가 바뀌는 실수가 일어날 수 있다. 예시) public interface MemberRepository extends JpaRepository { @Query("select m from Member m where m.username = :name") Member findMembers(@Param("name") String username); } 컬렉션 파라미터 바인딩 Collectio..
@Query, 값, DTO 조회하기 단순히 값 하나를 조회하기 *JPA 값 타입(@Embedded)도 이 방식으로 조회할 수 있다. @Query("select m.username from Member m") List findUsernameList(); DTO로 직접 조회하기 @Query("select new study.datajpa.dto.MemberDto(m.id, m.username, t.name) " + "from Member m join m.team t") List findMemberDto(); *주의: DTO로 직접 조회하려면 JPA의 new 명령어를 사용해야 한다. 그리고 다음과 같이 생성자가 맞는 DTO가 필요하다. DTO 예시 @Data public class MemberDto { priv..
메소드 이름으로 쿼리 생성 메소드 이름을 분석해서 JPQL 쿼리 실행 예) 이름과 나이름 기준으로 회원을 조회하려면? JPA Repository public List findByUsernameAndAgeGreaterThan(String username, int age) { return em.createQuery("select m from Member m where m.username = :username and m.age > :age") .setParameter("username", username) .setParameter("age", age) .getResultList(); } JPA 테스트 코드 @Test public void findByUsernameAndAgeGreaterThan() { Memb..