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 실행 } 변경 감지의 단점 원본이 있어야 변경 감지를 한다..
💻dev
@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..
다형성 쿼리 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 자바의 타입 캐스팅과 유사하다. 상속 구조에서 부모 타입을 특정 자식 타입으로 다룰 때 사용한다. FROM, WHERE, SELECT(하이버네이트 지원) 사용한다. 예) 부모인 Item과 자식 Book이 있다. [JPQL] select i from Item i where treat(i as Book).author = ‘kim’ [SQL] select i.* from Item i where i.DT..