JPQL - 다형성 쿼리 TYPE 조회 대상을 특정 자식으로 한정 예) Item 중에 Book, Movie를 조회해라 [JPQL] select i from Item i where type(i) IN (Book, Movie) [SQL] select i from i where i.DTYPE in (‘B’, ‘M’) TREAT(JPA 2.1) 자바의 타입 캐스팅과 유사 상속 구조에서 부모 타입을 특정 자식 타입으로 다룰 때 사용 FROM, WHERE, SELECT(하이버네이트 지원) 사용 ex) 부모인 Item과 자식 Book이 있다. [JPQL] select i from Item i where treat(i as Book).auther = ‘kim’ [SQL] select i.* from Item i whe..
JPQL - 경로 표현식 .(점)을 찍어 객체 그래프를 탐색하는 것 경로 표현식 용어 정리 상태 필드(state field): 단순히 값을 저장하기 위한 필드 (ex: m.username) 연관 필드(association field): 연관관계를 위한 필드 단일 값 연관 필드: @ManyToOne, @OneToOne, 대상이 엔티티(ex: m.team) 컬렉션 값 연관 필드: @OneToMany, @ManyToMany, 대상이 컬렉션(ex: m.orders) 경로 표현식 특징 상태 필드(state field): 경로 탐색의 끝, 탐색X JPQL: select m.username, m.age from Member m SQL: select m.username, m.age from Member m 단일 값 연..
JPQL(Java Persistence Query Language) JPQL은 객체지향 쿼리 언어 -> 테이블을 대상으로 쿼리 하는 것이 아니라 엔티티 객체를 대상으로 쿼리한다. JPQL은 SQL을 추상화해서 특정데이터베이스 SQL에 의존하지 않는다. JPQL은 결국 SQL로 변환된다. JPQL 문법 select m from Member as m where m.age > 18 엔티티와 속성은 대소문자 구분O (Member, age) JPQL 키워드는 대소문자 구분X (SELECT, FROM, where) 엔티티 이름 사용, 테이블 이름이 아님(Member) 별칭은 필수(m) (as는 생략가능) 집합과 정렬 GROUP BY, HAVING, ORDER BY TypeQuery, Query TypeQuery: ..
JPA는 다양한 쿼리 방법을 지원 JPQL, JPA Criteria, QueryDSL, 네이티브 SQL, JDBC API 직접 사용, MyBatis, SpringJdbcTemplate 함께 사용 JPQL 소개 가장 단순한 조회 방법 EntityManager.find() 객체 그래프 탐색(a.getB().getC()) 나이가 18살 이상인 회원을 모두 검색하고 싶다면? JPQL JPA를 사용하면 엔티티 객체를 중심으로 개발 문제는 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색 -> 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능 -> 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요 JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 ..
값 타입 컬렉션 값 타입을 하나 이상 저장할 때 사용 @ElementCollection, @CollectionTable 사용 데이터베이스는 컬렉션을 같은 테이블에 저장할 수 없다. 컬렉션을 저장하기 위한 별도의 테이블이 필요함 값 타입 컬렉션 사용 값 타입 저장 예제 Member member = new Member(); member.setUsername("member1"); member.setHomeAddress(new Address("city1", "street", "11")); member.getFavoriteFoodes().add("치킨"); member.getFavoriteFoodes().add("족발"); member.getAddressHistory().add(new Address("old1",..
JPA의 데이터 타입 엔티티 타입 @Entity로 정의하는 객체 데이터가 변해도 식별자로 지속해서 추적 가능 ex) 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식 가능 값 타입 int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 식별자가 없고 값만 있으므로 변경시 추적 불가 ex) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체 값 타입 분류 기본값 타입 자바 기본 타입(int, double) 래퍼 클래스(Integer, Long) String 임베디드 타입(embedded type, 복합 값 타입) 묶어서 값을 쓰고 싶을 때 쓰는 것 컬렉션 값 타입(collection value type) 자바 컬렉션에 기본값이나 임베디트 타입을 넣을 수 있는 것..
프록시 em.find() vs em.getReference() em.find() : 데이터베이스를 통해서 실제 엔티티 객체 조회 em.getReference() : 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회 → DB에 쿼리 안 나감 프록시 특징 실제 클래스를 상속 받아서 만들어짐 실제 클래스와 겉 모양이 같다. 사용하는 입장에서는 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 됨 프록시 객체는 실제 객체의 참조(target)를 보관 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드 호출 프록시 객체의 초기화 //프록시 객체 조회 Member findMember = em.getReference(Member.class, member.getId()); //내부적으로 영속성 컨텍스..
상속관계 매핑 관계형 데이터베이스는 상속관계 x 슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사 상속관계 매핑 → 객체의 상속 구조와 DB의 슈퍼타입 서브타입 관계를 매핑 Item @Entity public class Item { @Id @GeneratedValue private Long id; private String name; private int price; } Album @Entity public class Album extends Item{ private String artist; } Movie @Entity public class Movie extends Item{ private String director; private String actor; } Book @Entity pub..
연관관계 매핑시 고려사항 3가지 다중성 → DB 관점에서 다중성을 고민 다대일 : @ManyToOne 일대다 : @OneToMany 일대일 : @OneToOne 다대다 : @ManyToMany → 실무에서 쓰면 안 됨 단방향, 양방향 테이블 외래 키 하나로 양쪽 조인 가능 방향이라는 개념 X 객체 참조용 필드가 있는 쪽으로만 참조 가능 한쪽만 참조하면 단방향 양쪽이 서로 참조하면 양방향 연관관계의 주인 테이블은 외래 키 하나로 두 테이블이 연관관계를 맺음 객체 양방향 관계는 A→B, B→A처럼 참조가 두 군데 → 둘 중 테이블의 외래 키를 관리할 곳을 지정해야 한다. 연관관계의 주인 : 외래 키를 관리하는 참조 주인의 반대편 : 외래 키에 영향을 주지 않음, 단순 조회만 가능 다대일 [N:1] “다” 가..
양방향 매핑 시 가장 많이 하는 실수 연관관계의 주인에 값을 입력하지 않음 Member member = new Member(); member.setUsername("member1"); em.persist(member); Team team = new Team(); team.setName("TeamA"); team.getMembers().add(member); em.persist(team); Member의 TEAM_ID의 값이 NULL → 연관관계 주인이 Member에 있는 team → Team에 있는 members는 가짜 매핑 → 읽기 전용 → JPA에서 업데이트 할 때 사용하지 않는다. 연관관계의 주인에 값 넣어줘야 한다. Team team = new Team(); team.setName("TeamA")..