본 문서는 인프런의 자바 ORM 표준 JPA 프로그래밍 - 기본편 (김영한) 강의를 공부하며 작성한 개인 노트입니다.
경로 표현식: .(점)을 찍어 객체 그래프를 탐색하는 것
(예) m.username (상태 필드), from Member m m.team t (단일 값 연관필드), m.orders o (컬렉션 값 연관 필드)
@ManyToOne, @OneToOne@OneToMany, @ManyToManyselect m.username From Team t join t.members mselect m from Member m join m.team tselect m.team from Member m페치 조인, fetch join
[Left [OUTER] / INNER] JOIN FETCH (조인 경로)select m from Member m join fetch m.teamSELECT M.*, T.* FROM MEMBER M
INNER JOIN TEAM T ON M.TEAM_ID = T.ID일대다 관계에서 페치 조인
JPQL
select t
from Team t join fetch t.members
where t.name='팀A'
SQL
SELECT T.*, M.*
FROM TEAM T
INNER JOIN MEMBER M ON T.ID = M.TEAM_ID
WHERE T.NAME = '팀A'
(예) 회원 두명이 팀A 소속 > TEAM JOIN MEMBER 실행시 팀A는 레코드 두 row
일대다 관계에서만 일어나는 현상 (다대일 X)
DISTINCT
JPQL
select distinct t
from Team t join fetch t.members
where t.name='팀A'
일반 조인
select t From Team t join fetch t.members **as m**;as m 하면 안됨setFirstResult, setMaxResults<property name = "hibernate.default_batch_fetch_size" value="100">@OneToMany(fetch = FetchType.LAZY)다형성 설계 > 부모 자식 관계 등
조회 대상을 특정 자식으로 한정
(예) Item 중 Book, Movie 조회
select i from Item i
where type(i) IN (Book, Movie)
자바의 타입 캐스팅과 유사
JPQL에서 엔티티를 직접 사용하면 SQL에서 해당 엔티티의 기본키값 사용
select count(m.id) from Member mselect count(m) from Member mselect count(m.id) as cnt from Member m외래키 값 사용 예시
select m from Member where m.team = :team";select m from Member m where m.team.id = :teamId";select m.* from Member m where m.team_id=?@NamedQuery
@Entity
@NamedQuery(
name = "Member.findByUsername",
query = "select m from Member m where m.username = :username"
)
public class Member {}
애플리케이션 적용 예시
em.createNamedQuery("Member.findByUsername", Member.class)
.setParameter("username", "회원1")
.getResultList();
public interface UserRepository extends JpaRepository<User, Long> {
@Query("select u from User u where u.emailAddress=?1")
User findByEmailAddress(String emailAddress);
}
벌크 연산: pk 한건만 업데이트하는 경우를 제외한 모든 경우
executeUpdate() > 영향 받은 엔티티 수 반환String qlString = "update Product p " +
"set p.price = p.price * 1.1 " +
"where p.stockAmount < :stockAmount";
int resultCount = em.createQuery(qlString)
.setParameter("stockAmount", 10)
.executeUpdate();
em.clear())