본 문서는 인프런의 자바 ORM 표준 JPA 프로그래밍 - 기본편 (김영한) 강의를 공부하며 작성한 개인 노트입니다.
경로 표현식: .(점)을 찍어 객체 그래프를 탐색하는 것
(예) m.username (상태 필드), from Member m m.team t (단일 값 연관필드), m.orders o (컬렉션 값 연관 필드)
@ManyToOne
, @OneToOne
@OneToMany
, @ManyToMany
select m.username From Team t join t.members m
select m from Member m join m.team t
select m.team from Member m
페치 조인, fetch join
[Left [OUTER] / INNER] JOIN FETCH (조인 경로)
select m from Member m join fetch m.team
SELECT 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 m
select count(m) from Member m
select 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()
)