woowacourse-study / 2022-jpa-study

🔥 우아한테크코스 4기 JPA 스터디 (22.06.13~22.07.02) 🔥
5 stars 1 forks source link

[섹션 9, 10, 11] 오찌 제출합니다 #29

Closed Ohzzi closed 2 years ago

Ohzzi commented 2 years ago

섹션 9. 값 타입

기본값 타입

임베디드 타입(복합 값 타입)

@Entity
public class Member {

    @Id @GeneratedValue
    private Long id;
    private String name;

    @Embedded Period workPeriod; // 근무 기간
    @Embedded Address homeAddress; // 집 주소
    // ...
}
@Embeddable
public class Period {

    @Temporal(TemporalType.DATE) java.util.Date startDate;
    @Temporal(TemporalType.DATE) java.util.Date endDate;
    //..

    public boolean isWork(Date date) {
        //..
    }
}

값 타입과 불변 객체

값 타입의 비교

동일성 비교

동등성 비교

값 타입 컬렉션

@Entity
public class Member {

    @Id @GeneratedValue
    private Long id;

    @Embedded
    private Address homeAddress;

    @ElementCollection
    @CollectionTable(name = "FAVORITE_FOODS",
        joinColumns = @JoinColumn(name = "MEMBER_ID"))
    @Column(name = "FOOD_NAME")
    private Set<String> favoriteFoods = new HashSet<String>();

    @ElementCollection
    @CollectionTable(name = "ADDRESS", joinColumns
        = @JoinColumn(name = "MEMBER_ID"))
    private List<Address> addressHistory = new ArrayList<>();
    //...
}

@Embeddable
public class Address {

    @Column
    private String city;
    private String street;
    private String zipcode;
    //...
}

섹션 10. ~ 11. 객체지향 쿼리 언어

JPA가 공식 지원하는 SQL

공식 지원은 아니지만 알아볼둘 만한 기능

JPQL

JPQL: 엔티티 객체를 조회하는 객체지향 쿼리. 특정 데이터베이스에 의존하지 않음

String jpql = "select m from Member as m where m.username = 'kim'";
List<Member> resultList = em.createQuery(jpql, Member.class).getResultList();

select
    member.id as id,
    member.age as age,
    member.team_id as team,
    member.name as name
from
    Member member
where
    member.name='kim'

기본 문법

TypeQuery, Query

결과 조회

파라미터 바인딩

JPQL은 위치 기준 파라미터 뿐 아니라 이름 기준 파라미터 바인딩도 지원(NamedJdbcTemplate 처럼)

프로젝션

프로젝션: SELECT 절에 조회할 대상을 지전하는 것

프로젝션 대상

여러 값을 프로젝션 하는 경우 Object[]로 받거나 new로 DTO로 받을 수 있음

SELECT new jpabook.jpql.UserDTO(m.username, m.age) FROM Member m

페이징 API

JPA는 페이징을 다음의 두 API로 추상화

String jpql = "SELECT m FROM Member m ORDER BY m.name";

List<Member> members = em.createQuery(jpql, Member.class)
        .setFirstResult(0)
        .setMaxResults(10)
        .getResultList();

집합과 정렬

조인

페치 조인

JPQL에서 성능 최적화를 위해 제공하는 기능으로, 연관된 엔티티나 컬렉션을 한 번에 같이 조회하는 기능

select m from Member m join fetch m.team

페치 조인과 일반 조인의 차이

JPQL은 결과를 반환할 때 연관관계를 고려하지 않음. 단지 SELECT 절에 지정한 엔티티만 조회.

반면 페치 조인을 사용하면 연관된 엔티티도 함께 조회

경로 표현식

서브 쿼리

JPQL도 서브 쿼리를 지원하는데, WHERE, HAVING 절에서만 사용이 가능하며 SELECT, FROM 절에서는 사용 불가능함