[데이터베이스]/JPQL
조인 (2) - ON 절
완벽한 장면
2023. 8. 30. 17:53
조인 - ON 절
1. 조인 대상 필터링
예제
JpqlMain
public class JpqlMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
// 팀 먼저 저장
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setUsername("member1");
member.setAge(10);
em.persist(member);
member.setTeam(team); // 연관관계 편의 메서드 만들러 Member 다녀옴.
em.flush();
em.clear(); // 비움
String query = "select m from Member m left join m.team t on t.name = 'TeamA'";
List<Member> result = em.createQuery(query, Member.class)
.getResultList();
System.out.println("result.size = " + result.size());
for (Member member1 : result) {
System.out.println("member1 = " + member1);
}
tx.commit();
} catch (Exception e) {
tx.rollback();
e.printStackTrace();
} finally {
em.close();
}
emf.close();
}
}
2. 연관관계 없는 엔티티 외부 조인
예제
JpqlMain
public class JpqlMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
// 팀 먼저 저장
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setUsername("member1");
member.setAge(10);
em.persist(member);
member.setTeam(team); // 연관관계 편의 메서드 만들러 Member 다녀옴.
em.flush();
em.clear(); // 비움
//1번 String query = "select m from Member m left join m.team t on t.name = 'TeamA'";
String query = "select m from Member m left join Team t on m.username = t.name"; // 2번
List<Member> result = em.createQuery(query, Member.class)
.getResultList();
System.out.println("result.size = " + result.size());
for (Member member1 : result) {
System.out.println("member1 = " + member1);
}
tx.commit();
} catch (Exception e) {
tx.rollback();
e.printStackTrace();
} finally {
em.close();
}
emf.close();
}
}
두 실행 결과 한꺼번에 비교해보면 확실히 보인다.
728x90
반응형