본문 바로가기

JPA

(11)
JPQL 서브쿼리, 조건식, 기본 함수 JPQL 서브 쿼리, 조건식, 기본 함수 JPQL의 서브 쿼리와 조건식, 기본 함수에 대해 알아본다. JPQL서브 쿼리 em.persist(new Member("A", 10)); em.persist(new Member("D", 15)); em.persist(new Member("B", 20)); em.persist(new Member("C", 30)); List result = em.createQuery ("select m from Member m" + " where m.age > (select avg(subM.age) from Member subM)", Member.class) .getResultList(); result.forEach(System.out::println); Hibernate: sele..
JPQL 페이징, 조인과 조인 ON 절 JPQL 페이징, 조인과 조인 ON 절 JPQL 페이징 방법과 다양한 조인들에 대해서 알아본다 페이징 IntStream.rangeClosed(1, 50).forEach(i -> em.persist(new Member("member" + 1, i))); List result = em.createQuery ("select m from Member m order by m.age desc", Member.class) .setFirstResult(10) .setMaxResults(10) .getResultList(); order by로 정렬이 가능하다. 나이를 내림차순으로 지정하였다. setFirstResult로 조회 시작 위치를 지정할 수 있다. 0부터 시작이므로 11번째부터 가져올 것이다. setMaxResu..
JPQL: 기본문법과 프로젝션 JPQL SQL을 추상화한 객체 지향 쿼리 언어로 엔티티 객체 중심으로 쿼리를 작성할 수 있다. SQL은 데이터베이스 테이블을 대상으로 쿼리를 날리지만 JPQL은 엔티티 객체를 대상으로 쿼리를 날린다 JPQL로 작성하면 결국은 SQL로 변환되어 데이터베이스에 쿼리를 날리게 된다. JPQL 문법 em.createQuery("select m from Member m where m.age > 15", Member.class) Member 테이블 전체를 조회하는 JPQL 쿼리이다. select, from, where과 같은 키워드들은 대소문자를 구분하지 않는다. Member, m.age와 같이 엔티티와 속성은 대소문자를 구분하여야 한다. 테이블 이름이 아닌 엔티티 이름을 써야 한다. Member (as) m과 ..
JPA 연관관계 매핑 6. 영속성 전이(CASCADE)와 고아 객체 영속성 전이(CASCADE) 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들 때 사용하는 방법 부모 엔티티를 저장할 때 자식 엔티티를 저장하거나 , 부모 엔티티를 저장할 때 자식 엔티티도 같이 삭제하는 등의 방식으로 사용된다. 영속성 전이가 없을 때 @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter @Setter public class Child { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "child_id") private Long id; private String name; @ManyToOne @JoinColumn(nam..
JPA 연관관계 매핑 5. 즉시 로딩과 지연 로딩 즉시 로딩과 지연 로딩 즉시 로딩이란 객체 A를 조회할 때 A와 연관된 객체들을 한 번에 가져오는 것이다. 지연 로딩이란 객체 A를 조회할 때는 A만 가져오고 연관된 애들은 저번 게시글에서 본 프락시 초기화 방법으로 가져온다. EAGER, LAZY 즉시 로딩(EAGER)과 지연 로딩(LAZY)은 연관관계의 다중성에 따라 기본값이 달라진다. @ManyToOne, @OneToOne처럼 One으로 끝나는 것들은 기본값이 즉시 로딩이다. @OneToMany, @ManyToMany처럼 Many로 끝나는 것들은 기본값이 지연 로딩이다. 즉시 로딩 @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter @Setter public class Member ..
JPA 연관관계 매핑 4. 프록시 JPA의 프록시 어떤 A와 B가 연관관계가 있을 때 A를 호출할 때 항상 B도 함께 호출되면 효율적이지 못하다. 이럴 때 프록시를 활용하여 문제를 해결할 수 있다. 예제 엔티티 @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter @Setter public class Member extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "member_id") private Long id; private String name; @ManyToOne @JoinColumn(name = "team_id") private Team tea..
JPA 연관관계 매핑 3. 상속관계 매핑 상속관계 매핑 관계형 데이터 베이스에서는 상속관계가 존재하지 않는다. 슈퍼 타입 서브 타입 관계라는 모델링 기법으로 객체 상속과 유사하게 구현이 가능하다. 상속관계 매핑이란 객체의 상속 구조와 관계형 데이터베이스의 슈퍼 타입 서브타입 관계를 매핑해준다. 각각 테이블로 변환 조인 전략 사용 통합 테이블로 변환 단일 테이블 전략 사용 서브타입 테이블로 변환 구현 클래스마다 테이블 전략 사용 1. 조인 전략 테이블 생성 쿼리를 보면 Book table에서 item_id를 외래 키로 가지고 있는 것을 알 수 있다. @DiscriminatorColumn으로 서브 타입의 값을 알 수 있다. 서브 타입인 Book에서 @DiscriminatorValue("BOOK")을 통해 DTYPE에 넣을 값을 정할 수 있다. @E..
JPA 연관관계 매핑 2. 일대다, 다대일, 일대일, 다대다 연관관계 매핑 연관관계 매핑 연관관계 매핑 시 고려해야 할 3가지가 다중성, 단방향 or 양방향, 연관관계의 주인이라고 저번 게시글에 작성하였다. 이 게시글에서는 다중성에 대해 알아본다. JPA에서는 연관관계를 맺을 때 다중성을 annotation으로 표기한다. @ManyToMany, @ManyToOne, @OneToOne, @OneToMany으로 이름만 봐도 명확하게 이해가 가능하다. 일대일(@OneToOne) 일대일 연관관계 매핑은 저번 게시글에서 다룬 거처럼 외래 키를 원하는 곳에 두면 된다. 다대일(@ManyToOne) 다대일의 반대는 일대다이다. 그러므로 다대일 매핑을 하면 상대편 객체에서 일대다로 매핑을 하는 것과 같다. 실제 테이블에서는 다 쪽이 외래 키를 가지게 된다. 그러므로 다대일 매핑을 하는 게 명..