본문 바로가기

전체 글

(272)
3월 22일 SpringDataJPA hint & lock hint & lock JPA 쿼리 힌트 (이 힌트는 SQL힌트가 아니라 JPA 구현체(하이버네이트)에 제공하는 힌트) 만약 Member 라는 엔티티를 find하게 될 경우 JPA는 변경감지를 위해 원본 member 와 변경감지용 member를 스탭샷에 생성해서 총 2개의 엔티티를 가진다 그런데 개발자가 해당 엔티티를 변경할 계획없이 find한 경우 스탭샷을 만들지 않을 수 있다. Repository @QueryHints(value = @QueryHint(name = "org.hibernate.readOnly" , value = "true")) Member findReadOnlyByUsername(String username); 위 메소드로 member를 조회하면 "readOnly" 힌트로 인해 스탭샷을 ..
3월 22일 SpringDataJPA EntityGraph (fetch Join) EntityGraph //EntityGraph 는 @Query에서 fetch Join 을 사용할 때 사용 *fetch join을 필수적으로 알아야 한다. fetch = fetchType.LAZY 최초 호출시 proxy값을 가져오고 그 값에 접근할때 지연로딩을 수행하는것 지연로딩이 일어나는걸 n+1문제라 한다. 이 n+1문제를 fetch join으로 해결한다. fetch join은 해당 엔티티에 지연로딩 필드들을 즉시로딩으로 다 가져온다, 연관관계에 필드를 객체그래프라 한다 간단한 fetch join은 데이터 JPA를 사용 , 복잡하면 JPQL을 사용 ex) @override @EntityGraph(attributePaths = {"team"}) //fetch join 할 필드값을 넣어준다. List fi..
3월 22일 SpringDataJPA 벌크성 수정 쿼리 DB에 update 쿼리 1번으로 엔티티의 모든 요소를 수정하는것을 벌크성 수정 쿼리라 한다. 쿼리가 적용되는 요소가 2개이상인 경우를 말한다, 순수 JPA에서의 벌크 연산 Repository public int bulkAgePlus(int age){ return em.createQuery( "update Member m set m.age = m.age +1" + " where m.age >= :age") .setParameter("age" , age) .excuteUpdate() //excuteUpdate는 최종적으로 연산이 적용된 데이터의 갯수가 나온다. } 데이터 JPA 벌크연산 Repository @Modifying //update 시엔 이 값을 꼭 넣어야 한다, 없으면 에러가 발생 @Query(..
3월 22일 SpringDataJPA 페이징과 정렬 SpringDataJPA 페이징과 정렬 순수 JPA 페이징과 정렬 예제 조건 검색조건 , 나이가 10살, 정렬조건 , 이름으로 내림차순 페이징조건 , 첫번째페이지 , 페이지량을 보여줄 데이터 3건 Repository public List findByPage(int age , int offset , int limit){ return em.createQuery( "select m from Member m where m.age = :age" + " orderBy m.username desc") .setFirstResult(offset) .setMaxResults(limit) .getResultList() } public long totalCount(int age){ return em.createQuery( "..
3월 21일 SpringDataJPA 반환타입 SpringDataJPA 반환타입 List findByUsername(String name) //컬렉션을 반환 Member findByUsername(String name) //단건 조회 Optional findByUsername(String name) // Optional 단건 List로 값을 받을때 만약 찾는 값이 없다면 null이 아니라 빈 Collection을 반환한다. empty컬렉션을 반환한다. 단건 조회의 경우 값이 없으면 null , 2개이상 있으면 Exception을 반환한다. 그래서 Optional은 null이어도 Empty를 반환하기 때문에 결과값이 있을수도 있고 없을수도 있을댄 Optional을 사용한다,
3월 21일 SpringDataJPA 리포지토리에 메소드 구현 @Query 리포지토리 메소드 구현하기(정적쿼리) Repository에 JPQL바로 구현하기 @Query("select m from Member m where m.username =:username and m.age = :age" ) List findUser(@Param("username") String username , @Param(age) int age); 이 방법은 JPQL을 바로쓰고 이름도 간결하게 쓸 수 있다. JPQL에 오타가 있으면 애플리케이션 코딩시점에 오류를 반환한다. @Query에 JPQL을 바로 넣어서 해당 메소드 실행시 같이 실행시킬 수 있다. Query값 DTO 조회하기 ( 실무에서 많이사용) 1.Stirng / Int로 받아오는 경우 @Query("select m.usernam..
3월 21일 Spring Data JPA 쿼리 메소드2 NamedQuery NamedQuery 거의 쓸일 없음. 1.엔티티에 named Query 정의 @NamedQuery( name = "member.findByUsername" query = "select m from Member m where m.username = :username" ) 2.DataJPA를 상속만 Repository에 작성 @Query(name = "Member.findByUsername") // namedQuery 의 name 으로 식별한다. List findByUsername(@Param("username") String username); @Query에 파라미터가 필요한 경우 @Param을 사용한다. 실행하면 해당 named Query가 실행된다. 메소드명이 NamedQuery와 같다면 @Query를..
3월 21일 SpringDataJPA 쿼리메소드 쿼리메소드 기능 예를 들어 JPARepository에 선언되어있지않은 List findByUsername(String username)와 같이 개별적으로 정의한 메소드의 사용방법. 일반적인 경우 순수 JPA , JPQL을 짜야한다. public List findByUsernameAndAgeGreatorthen(String username , int age){ return em.createQuery( "select m from Member m where m.username =:username and a.age=:age" ).setParameter("username" , username) .setParameter("age" , age) .getResultList(); } Data Jpa로 해결 1.JPARe..