본문 바로가기

JPA/JPQL

(9)
Bulk 연산 한 번에 많은 행을 삭제하거나 수정하는 연산을 Bulk 연산이라고 한다. 이번 글에서는 Bulk 연산을 하는 법과 주의점에 대해서 살펴보겠다. Bulk 연산하기 String query = "update Student s set s.age = s.age + 1"; int updatedDataSize = em.createQuery(query).executeUpdate(); System.out.println("updatedDataSize = " + updatedDataSize); 로그 Hibernate: update Student set age=age+1 updatedDataSize = 3 executeUpdate()를 통해 delete나 update 쿼리를 날릴 수 있다. 또한 executeUpdate()는..
JPQL 엔티티 조회 github 전체코드 주소(branch: jpql/entity) JPQL에서는 PK(식별자)가 아닌 엔티티 자체를 사용해 데이터를 조회할 수 있다. JPQL에서 엔티티를 직접 사용하면 SQL에서는 해당 Table의 PK 값을 사용한다. 음~~~ 별 거 아니니까 바로 살펴보도록 하겠다. #JPQL: 엔티티를 직접 사용 select count(s) from Student s #SQL: 엔티티의 PK를 사용 select count(s.id) as cnt from Student s 연관 엔티티를 그대로 사용하면 어떻게 될까? JpaMain.java - 조회로직 String query = "select s from Student s where s.club = :club"; List students = em.cre..
페치조인 특징과 한계 github 전체코드 주소(branch: fetchDetail) 별칭 사용 페치 조인 대상에는 JPA 표준 스펙 상 별칭 사용이 불가능하다. 하이버네이트에서는 사용이 가능하지만, 가급적 사용하지 않는 것이 좋다.(특히 where문에 사용 금지) JpaMain.java - 조회 로직 String query = "select distinct c from Club c join fetch c.students s where s.id
N+1과 fetch join github 전체코드 주소(branch: fetch) Club.java package hellojpa; import lombok.Data; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.OneToMany; import java.util.ArrayList; import java.util.List; @Data @Entity public class Club { @Id @GeneratedValue private Long id; private String name; @OneToMany(mappedBy = "club") private ..
경로표현식 github 전체코드 주소(branch: JPQL/path) Student.java package hellojpa; import lombok.AccessLevel; import lombok.Data; import lombok.Setter; import javax.persistence.*; import java.util.ArrayList; import java.util.List; @Entity @Data public class Student { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; private String name; private int age; @Setter(AccessLevel.PROTECTED) @ManyToOne(fet..
JPQL 함수 github 전체코드 주소(branch: function) JPA 표준함수 JPA 표준함수(DB에 관계없이 사용가능): CONCAT, SUBSTRING, TRIM , LOWER, UPPER 등 // JPQL 표준함수 String query = "select concat('이름: ', s.name) from Student s"; List school = em.createQuery(query, String.class).getResultList(); System.out.println("student name = " + school.get(0)); JPQL 표준함수는 DB(방언)에 상관없이 사용가능하다. 실행 후 로그는 다음과 같다.(H2 DB 기준) Hibernate:select ('이름: '||student..
JPQL에서의 Enum과 조건식 Student.java package hellojpa; import lombok.AccessLevel; import lombok.Data; import lombok.Setter; import javax.persistence.*; @Entity @Data public class Student { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; private String name; private int age; @Embedded private Address address; @Setter(AccessLevel.PROTECTED) @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "CLUB_ID")..
서브쿼리 JPQL에서 서브쿼리도 사용가능하다. 이 글에서는 서브쿼리가 무엇인지보다는 JPQL에서 서브쿼리를 어떻게 사용하는지에 대해 탐구해볼 것이다. JPQL 서브쿼리 // progammin부원들의 나이와 일치하는 학생 조회 String query = "select s from Student s where s.age in (select s.age from Student s join s.club c on s.club.name = 'programming')"; List students = em.createQuery(query).getResultList(); 실질적인 SQL select s from Student s where s.age in ( select s1.age from Student s1 inner join..