코드 그라데이션
조인 (1) - 내부 조인, 외부 조인, 세타 조인 본문
조인
- SQL의 조인과 양상은 비슷하나 얘는 엔티티 중심으로 동작한다.
- 약간 객체 스타일로 조인 문법이 나간다. 연관있는 것을 . 으로 표현한다.
- 간단히 복기하고 넘어가면 내부조인은 값이 없으면 그대로 안 나오지만, 외부조인은 한쪽의 값이라도 있으면 없는 쪽은 빠진 채로 출력됨.
예제
Member에 Team getter, setter 먼저 추가 후, Team에도 Member의 getter, setter 추가 후 작업
Member에 Lazy로 전략 명기
@ManyToOne(fetch = FetchType.LAZY) // 중요.
@JoinColumn(name = "TEAM_ID")
private Team team;
Member - 연관관계 편의 메서드 추가
public void changeTeam(Team team) {
this.team = team;
team.getMembers().add(this);
}
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 inner join m.team t";
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();
}
}
실행하면
Team을 조인 해서 가져온다.
이제부터는 팀을 가져오거나 파라미터로 받아오는 등의 작업들을 자유롭게 할 수 있다.
String query = "select m from Member m left join m.team t";
이렇게 바꿔주면
이러한 형태로 나오고
세타 조인으로 바꾸면
String query = "select m from Member m, Team t where m.username = t.name";
만약 진짜 username과 team이름이 같은 게 있다고(teamA라는 이름) 바꿔버리면
이렇게 찍으면
진짜로 출력됨...!
728x90
Comments