Language`/JPA(32)
-
[JPA] 조건식
1. 타입 표현 JPQL에서 타입 표현은 대소문자를 구분하지 않는다 (1) 문자 문자 타입은 작은따옴표(')로 감싸서 표현해준다 List resultList = em.createQuery( "SELECT m" + " FROM Member m" + " WHERE m.username BETWEEN 'Avenus3' AND 'Avenus6'", Member.class ).getResultList(); List resultList = em.createQuery( "SELECT m" + " FROM Member m" + " WHERE m.username BETWEEN \"Avenus3\" AND \"Avenus6\"", Member.class ).getResultList(); 이렇게 문자 타입은 큰따옴표(")로 ..
2022.08.10 -
[JPA] 서브 쿼리
※ 서브쿼리 예제 데이터 JPQL 서브쿼리 JPQL도 SQL처럼 서브쿼리를 지원하지만 모든 서브쿼리를 지원하는 것은 아니다. SELECT절 → Hibernate의 HQL에서는 허용 O / JPA 자체에서는 허용 X FROM절 → 허용 X WHERE절 → 허용 O HAVING절 → 허용 O from절에서의 서브쿼리는 JPA, Hibernate에서는 허용을 하지 않지만, JPA의 다른 구현체에서는 허용한다 1. SELECT절 서브쿼리 (Hibernate의 HQL) (1) Member별로 주문을 한 횟수 List resultList = em.createQuery( "SELECT m, (SELECT COUNT(*) FROM Order o WHERE o.member.id = m.id)" + " FROM Membe..
2022.08.10 -
[JPA] Join
※ Join Query를 위한 테스트 데이터 내부조인 JPQL에서 기본적으로 내부 조인은 "INNER JOIN"으로 사용하고 여기서 INNER은 생략할 수 있다 회원 조회 : 팀이 Team-A인 회원 (팀에 대한 내부 조인) // INNER 명시 List result = em.createQuery( "SELECT m FROM Member m INNER JOIN m.team WHERE m.team.name = :name", Member.class ).setParameter("name", "Team-A") .getResultList(); // INNER 명시 X List result = em.createQuery( "SELECT m FROM Member m JOIN m.team WHERE m.team.nam..
2022.07.29 -
[JPA] 프로젝션 & 페이징
프로젝션 (Projection) 프로젝션이란 SELECT 절에서 조회할 대상을 지정하는 것을 의미한다 SELECT 절에서 조회할 수 있는 대상은 크게 3가지 분류로 나눌 수 있다 1. 엔티티 타입 프로젝션 엔티티 프로젝션은 말그대로 원하는 엔티티(객체) 자체를 통째로 조회하는 것이다 // Member(Entity) List members = em.createQuery( "SELECT m FROM Member m", Member.class ).getResultList(); // Team(Entity : Member -> Team) List team = em.createQuery( "SELECT m.team FROM Member m", Team.class ).getResultList(); Member와 Te..
2022.07.28 -
[JPA] JPQL 기본 문법
[JPA] 객체지향 쿼리 소개 (JPQL, Criteria, QueryDSL, ...) 일반적으로 SQL에 query를 날리는 방식은 다음과 같다 -- Member 테이블의 모든 정보 가져오기 SELECT * FROM Member; 하지만 JPA에서 생성하는 query는 이와 다르다 물론 JPA에서도 native query를 생성해서 DB로.. cs-ssupport.tistory.com 이전에 엔티티를 쿼리하는 다양한 방법을 짧게 소개했었다. 여기서 가장 중요한 사실은 어떤 방법을 사용하든 JPQL에서부터 시작한다는 사실이다 JPQL의 특징은 다음과 같다 - 테이블을 대상으로 쿼리하는게 아닌 엔티티를 대상으로 쿼리하는 객체지향 쿼리 언어이다 - SQL을 추상화한 쿼리 언어이므로 특정 DB에 종속적이지 않..
2022.07.28 -
[JPA] 객체지향 쿼리 소개 (JPQL, Criteria, QueryDSL, ...)
일반적으로 SQL에 query를 날리는 방식은 다음과 같다 -- Member 테이블의 모든 정보 가져오기 SELECT * FROM Member; 하지만 JPA에서 생성하는 query는 이와 다르다 물론 JPA에서도 native query를 생성해서 DB로 날릴 수 있다 (nativeQuery) -- Member 테이블의 모든 정보 가져오기 SELECT m FROM Member m 여기서 native Query와 JPA에서 생성하는 query의 차이는 다음과 같다 native query : DB의 테이블을 대상으로 쿼리 생성 JPQL : 엔티티(객체)를 대상으로 쿼리 생성 일반적인 SQL이 DB Table을 대상으로 하는 "데이터 중심의 쿼리"라면 JPQL이란 엔티티 객체를 대상으로 하는 "객체지향 쿼리"..
2022.07.27 -
[JPA] 값 타입
JPA의 데이터 타입을 큰 카테고리로 나누면 총 2개의 카테고리로 나눌 수 있다 엔티티 타입 값 타입 엔티티 타입은 말그대로 @Entity로 정의되는 객체를 의미하고, 값 타입은 단순히 값으로 사용되는 자바의 기본 타입이나 객체를 의미한다 여기서 이 두 타입의 가장 큰 차이점은 "추적의 가능성"이다 → 엔티티 타입은 "식별자"를 통해서 엔티티를 추적할 수 있지만, 값 타입은 별도의 식별자 개념이 없기 때문에 값이 바뀌어버리면 추적 자체가 불가능하다 @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity @Table(name = "member") public class Member { @Id @GeneratedValue(strategy = G..
2022.07.22 -
[JPA] 영속성 전이 & 고아 객체
영속성 전이 : CASCADE 특정 엔티티를 "영속 상태"로 만들 때 → 연관된 엔티티도 함께 영속 상태로 만들고 싶다면 어떻게 해야할까 >> 영속성 전이 기능 (Transitive Persistence) JPA에서는 영속성 전이를 CASCADE 옵션을 통해서 제공한다 @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity @Table(name = "member") public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "member_id") private Long id; private String name; @ManyToOne(f..
2022.07.06 -
[JPA] 즉시로딩 & 지연로딩
> "즉시 로딩 전략"을 활용하면 연관된 Entity도 DB에서 조회해서 실제 Entity가 반환된다 대부분의 JPA 구현체는 "즉시 로딩을 최적화"하기 위해서 가능하면 조인 쿼리를 사용한다 >> 위의 예제에서도 Member와 Team간의 left outer join을 통해서 쿼리 1번으로 연관된 두 엔티티를 모두 조회하였다 ※ 즉시로딩 & NULL 제약 조건 위의 조인을 잘 보면 "left outer join" : 외부조인을 통해서 Member과 Team이 조인을 하고 있다 현재 Member Table에서는 Team 컬럼에 대한 nullable을 허용하고 있는 상태이다 >> 따라서 Player중에 team이 없는 Player도 존재한다는 의미이다 그렇기 때문에 이 Member에 대한 instance도 ..
2022.07.06 -
[JPA] 프록시
선수 Entity와 팀 Entity가 존재하고 서로 다대일 관계이다. Player (N) @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity @Table(name = "player") public class Player { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "player_id") private Long id; private String name; @ManyToOne @JoinColumn(name = "team_id") private Team team; } Team (1) @Getter @NoArgsConstructor(access = Access..
2022.07.06 -
[JPA] 식별 관계 & 복합 키
DB에서 두 테이블간에 관계를 나타낼때는 총 2가지로 분류할 수 있다 1. 상대방의 PK를 자신의 PK이자 FK로 사용 = 식별관계 2. 상대방의 PK를 자신의 FK로 사용 = 비식별관계 필수적 비식별 관계(Mandatory) : FK에 NULL 허용 X 선택적 비식별 관계(Optional) : FK에 NULL을 허용 O 비식별 관계 (복합키) 현재 PARENT Table은 PK가 "복합키"로 구성되어있는 상태이고 CHILD와 1:N 관계이다 따라서 CHILD는 PARENT의 PK : 복합키를 자신의 FK로 활용함으로써 둘의 관계는 비식별 관계이다 @Entity @Table(name = "parent") public class Parent { @Id @Column(name = "parent_id1") p..
2022.07.05 -
[JPA] @MappedSuperClass
[JPA] 상속 관계 일반적으로 관계형 DB에서는 객체지향 언어에서 다루는 "상속"이라는 개념이 존재하지 않는다 그대신 "슈퍼타입 - 서브타입"같은 모델링 기법을 통해서 우회적으로 상속을 구현할 수 있다 슈퍼 cs-ssupport.tistory.com 상속 관계의 기본적으로 JOINED 전략을 사용하면 Super Type & Sub Type 모두 DB Table과 매핑되었다 하지만 여기서 부모 클래스는 DB Table과 매핑하지 않고 자식 클래스에게 속성만 물려주고 싶다면 @MappedSuperClass를 사용하면 된다 @MappedSuperClass는 단순히 "필드 정보"를 상속할 목적으로만 사용하는 것이다 예를 들어서 거의 모든 테이블에 필요한 {생성 날짜 / 생성한 사람 / 수정 날짜 / 수정한 사..
2022.07.05