분류 전체보기 191

fetch join

최적화가 필요하면 사용 SQL 조인 종류가 아님 연관된 엔티티나 컬렉션을 SQL 한번에 함께 조회하는 기능 JPQL 에서 최적화가 필요한 곳에서 사용함 join fetch 명령어 사용 지연 로딩으로 설정되어있어도 fetch join이 우선임 쿼리는 inner join으로 생성되나, entity 객체에 from 절의 모든 객체가 자동으로 담기게 된다. inner join은 from 절의 모든 객체가 자동 세팅이 안된다. String query = "select m from Member m join fetch Team t on t.id = m.team.id"; List resultList = em.createQuery(query, Member.class).getResultList(); // 정상 실행되며 M..

JPA/JPQL 2020.06.09

벌크 연산

조건에 해당하는 모든 데이터를 일괄 수정시 사용 int resultCount = em.createQuery("update Member m set m.age = 20").executeUpdate(); insert into select 사용 가능. 벌크 연산은 영속성 컨텍스트를 무시하고 DB에 직접 쿼리 수행 ** 벌크 연산을 먼저 수행, 벌크 연산 수행 후 영속성 컨텍스트 초기화 em.clear(); 반드시 수행할것(DB 수정 이후 영속성 컨텍스트를 초기화하지 않으면, 작업한 내역이 보이지 않음.)

JPA/JPQL 2020.06.09

JPQL 기본 문법

TypedQuery : 리턴 타입이 확실한 경우 사용 TypedQuery query1 = em.createQuery("select m from Member m", Member.class); TypedQuery query2 = em.createQuery("select m.username from Member m", String.class); Query : 리턴 타입이 정확하지 않을 경우 사용 Query query3 = em.createQuery("select m.username, m.age from Member m"); 단순 값을 DTO로 조회 : 패키지 명을 전부 적어야함 List resultList = em.createQuery("select new jpql.MemberDTO(m.username, m...

JPA/JPQL 2020.06.09

JPQL 특징

JPQL은 SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다. 엔티티와 속성은 대소문자 구분 - 엔티티 : 대문자 (Member) - 속성 : 소문자 (age) JPQL 키워드는 대소문자 구분 X(SELECT, FROM , where) 엔티티 이름 사용, 테이블 이름이 아님 별칭은 필수(as 생략 가능) ANSI 규약의 쿼리문은 모두 지원함 - COUNT, SUM, AVG ... - GROUP BY, HAVING, ORDER BY ... TypeQuery : 반환 타입이 명확할 때 사용 - Query 반환 타입이 명확하지 않을 때 사용

JPA/JPQL 2020.06.09

SAVE 메서드 주의 사항

새로운 엔티티인 경우 저장 새로운 엔티티가 아닌 경우 MERGE 함 *** @GeneratedValue 인 경우 식별자가 없을 경우 SAVE 가 호출되나 @Id 만 사용한 경우 식별자가 있는 것으로 간주하여 SELECT SAVE가 호출된다. 매우 비효율적이므로 implements Persistable의 isNew를 구현하여 직접 SAVE가 호출되도록 할 수 있다. @Entity @Getter @EntityListeners(AuditingEntityListener.class) @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Item implements Persistable { @Id private String id; @CreatedDate ..

JPA/JPA 2020.06.09