.(점)
을 찍어 객체 그래프를 탐색하는 것select m.username // m.username : 상태 필드
from Member as m
join m.team t // m.team : 단일 값 연관필드
join m.orders o // m.orders : 컬렉션 값 연관필드
where t.name = '팀A';
✔️경로 표현식(상태 필드)
String query = "select m.name from Member as m"; // 상태 필드
List<String> resultList = em.createQuery(query, String.class).getResultList();
for (String s : resultList) {
System.out.println("s = " + s);
}
경로 표현식(상태 필드) 실행 결과
Hibernate:
/* select
m.name
from
Member as m */ select
m1_0.name
from
MEMBERS m1_0
✔️경로 표현식(단일 값 연관필드) → 묵시적 내부 조인이 발생, 탐색O
String query = "select m.team from Member as m"; // 단일 값 연관필드
List<String> resultList = em.createQuery(query, String.class).getResultList();
for (String s : resultList) {
System.out.println("s = " + s);
}
경로 표현식(단일 값 연관필드) 실행 결과
Hibernate:
/* select
m.team
from
Member as m */ select
t1_0.TEAM_ID,
t1_0.name
from
MEMBERS m1_0
join
Team t1_0
on t1_0.TEAM_ID=m1_0.TEAM_ID
✔️경로 표현식(컬렉션 값 연관필드) → 묵시적 내부 조인 발생, 탐색X
String query = "select t.members from Team as t";
List resultList = em.createQuery(query, List.class).getResultList();
for (Object object : resultList) {
System.out.println("object = " + object);
}
경로 표현식(컬렉션 값 연관필드) 실행 결과
Hibernate:
/* select
t.members
from
Team as t */ select
m1_0.MEMBER_ID,
m1_0.age,
m1_0.memberType,
m1_0.name,
t1_0.TEAM_ID,
t1_0.name
from
Team t1_0
join
MEMBERS m1_0
on t1_0.TEAM_ID=m1_0.TEAM_ID
select m from Member as m join m.Team as t
select m.team from Member as m
join fetch
명령어 사용public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin();
try {
/////////////////////////////// ①
Team teamA = new Team();
teamA.setName("teamA");
em.persist(teamA);
Member memberA = new Member();
memberA.setName("memberA");
memberA.addMember(teamA);
em.persist(memberA);
///////////////////////////////
/////////////////////////////// ②
Team teamB = new Team();
teamB.setName("teamB");
em.persist(teamB);
Member memberB = new Member();
memberB.setName("memberB");
memberB.addMember(teamB);
em.persist(memberB);
Member memberC = new Member();
memberC.setName("memberC");
memberC.addMember(teamB);
em.persist(memberC);
///////////////////////////////
em.flush();
em.clear();
////////////////////////////////////////////////////////////// ③
List<Member> list = em.createQuery("select m from Member as m", Member.class).getResultList();
for (Member member : list) {
System.out.println("member = " + member.getName() + ", member.team = " + member.getTeam().getName());
}
//////////////////////////////////////////////////////////////
transaction.commit();
} catch (Exception e) {
transaction.rollback();
} finally {
em.close();
}
emf.close();
}
}
실행 결과
Hibernate:
/* select
m
from
Member as m */ select
m1_0.MEMBER_ID,
m1_0.age,
m1_0.memberType,
m1_0.name,
m1_0.TEAM_ID
from
MEMBERS m1_0
Hibernate:
select
t1_0.TEAM_ID,
t1_0.name
from
Team t1_0
where
t1_0.TEAM_ID=?
member = memberA, member.team = teamA
Hibernate:
select
t1_0.TEAM_ID,
t1_0.name
from
Team t1_0
where
t1_0.TEAM_ID=?
member = memberB, member.team = teamB
member = memberC, member.team = teamB
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin();
try {
Team teamA = new Team();
teamA.setName("teamA");
em.persist(teamA);
Team teamB = new Team();
teamB.setName("teamB");
em.persist(teamB);
Member memberA = new Member();
memberA.setName("memberA");
memberA.addMember(teamA);
em.persist(memberA);
Member memberB = new Member();
memberB.setName("memberB");
memberB.addMember(teamB);
em.persist(memberB);
Member memberC = new Member();
memberC.setName("memberC");
memberC.addMember(teamB);
em.persist(memberC);
em.flush();
em.clear();
//////////////////////////////////////////////////////////////
List<Member> list = em.createQuery("select m from Member as m join fetch m.team as t", Member.class).getResultList();
for (Member member : list) {
System.out.println("member = " + member.getName() + ", member.team = " + member.getTeam().getName());
}
//////////////////////////////////////////////////////////////
transaction.commit();
} catch (Exception e) {
transaction.rollback();
} finally {
em.close();
}
emf.close();
}
}
실행 결과
Hibernate:
/* select
m
from
Member as m
join
fetch
m.team as t */ select
m1_0.MEMBER_ID,
m1_0.age,
m1_0.memberType,
m1_0.name,
t1_0.TEAM_ID,
t1_0.name
from
MEMBERS m1_0
join
Team t1_0
on t1_0.TEAM_ID=m1_0.TEAM_ID
member = memberA, member.team = teamA
member = memberB, member.team = teamB
member = memberC, member.team = teamB
DISTINCT
는 중복된 결과를 제거하는 명령이다.DISTINCT
는 SQL에 DISTINCT
를 추가하는 것은 물론이고 애플리케이셚에서 한 번 더 중복을 제거한다.public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin();
try {
Team teamA = new Team();
teamA.setName("teamA");
em.persist(teamA);
Team teamB = new Team();
teamB.setName("teamB");
em.persist(teamB);
Member memberA = new Member();
memberA.setName("memberA");
memberA.addMember(teamA);
em.persist(memberA);
Member memberB = new Member();
memberB.setName("memberB");
memberB.addMember(teamB);
em.persist(memberB);
Member memberC = new Member();
memberC.setName("memberC");
memberC.addMember(teamB);
em.persist(memberC);
em.flush();
em.clear();
//////////////////////////////////////////////////////////////
List<Team> list = em.createQuery("select distinct t from Team as t join fetch t.members", Team.class).getResultList();
for (Team team : list) {
System.out.println("team.name = " + team.getName() + ", team.size = " + team.getMembers().size());
}
//////////////////////////////////////////////////////////////
transaction.commit();
} catch (Exception e) {
transaction.rollback();
} finally {
em.close();
}
emf.close();
}
}
실행 결과
Hibernate:
/* select
distinct t
from
Team as t
join
fetch
t.members */ select
distinct t1_0.TEAM_ID,
m1_0.TEAM_ID,
m1_0.MEMBER_ID,
m1_0.age,
m1_0.memberType,
m1_0.name,
t1_0.name
from
Team t1_0
join
MEMBERS m1_0
on t1_0.TEAM_ID=m1_0.TEAM_ID
team.name = teamA, team.size = 1
team.name = teamB, team.size = 2
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin();
try {
Book book1 = new Book();
Book book2 = new Book();
Album album = new Album();
em.persist(book1);
em.persist(book2);
em.persist(album);
em.flush();
em.clear();
//////////////////////////////////////////////////////////////
List<Item> resultList = em.createQuery("select i from Item as i where type(i) in (Book)", Item.class).getResultList();
for (Item item : resultList) {
System.out.println("item = " + item);
}
//////////////////////////////////////////////////////////////
transaction.commit();
} catch (Exception e) {
transaction.rollback();
} finally {
em.close();
}
emf.close();
}
}
실행 결과
Hibernate:
/* select
i
from
Item as i
where
type(i) in (Book) */ select
i1_0.ITEM_ID,
i1_0.DTYPE,
i1_0.name,
i1_0.singer,
i1_0.author,
i1_0.isbn
from
Item i1_0
where
i1_0.DTYPE in ('B')
item = hellojpa.domain.Book@342a1f84
item = hellojpa.domain.Book@72001c71