@ManyToOne @OneToOneselect m.team from Member mselect m from Member m join m.team t@OneToMany @ManyToManyselect t.members from Team t > 더이상 탐색 Xselect m.username from Team t join t.members m > 탐색 가능
String query= "select m from Member m join fetch m.team ";
List<Member> result = em.createQuery(query, Member.class)
.getResultList();
for (Member member : result) {
System.out.println("member = " + member.getUsername() + ", " +
member.getTeam().getName());
}
String query= "select t from Team t join fetch t.members ";
List<Team> result = em.createQuery(query, Team.class)
.getResultList();
for (Team team : result) {
System.out.println("team = "+ team.getName() +
"|members=" + team.getMembers().size());
}
JPQL의 DISTINCT
1. SQL에 DISTINCT를 추가하는 기능 제공
2. 애플리케이션 레벨에서(DB 아님) 엔티티 중복 제거하는 기능 제공
select t from Team t join fetch t.members (as m where m.age > 10) 가급적 사용 X세가지 방법
1. 페치조인을 사용해서 엔티티를 조회
2. 페치 조인을 해서 애플리케이션에서 DTO로 바꿔서 화면에 반환
3. JPQL을 짤 때 부터 DTO로 스위칭 해서 가져옴
select count(m) from Member m //엔티티를 함수에서 직접 사용
// select count(m.id) from Member m 와 같음
String jpql = “select m from Member m where m = :member”; // 엔티티를 파라미터로 전달
// select m from Member m where m.id = :memberId 와 같음
List resultList = em.createQuery(jpql)
.setParameter("member", member)
.getResultList();
String qlString = “select m from Member m where m.team = :team”; // 외래키값으로 사용
// select m from Member m where m.team.id = :teamId 와 같음
List resultList = em.createQuery(qlString)
.setParameter("team", team)
.getResultList();
@Entity
@NamedQuery(
name = "Member.findByUsername",
query="select m from Member m where m.username = :username")
public class Member {
...
}
List<Member> resultList =
em.createNamedQuery("Member.findByUsername", Member.class)
.setParameter("username", "회원1")
.getResultList();
주의
// flush를 자동 호출함
// (flush는 commit을 하거나, 쿼리가 나가거나 할 때 자동 호출 되고 강제로 flush를 호출해도 됨)
int resultCount = em.createQuery("update Member m set m.age=20")
.executeUpdate();
em.clear();
// 아직 변경된 것이 적용되지 않은 영속성 컨텍스트의 값을 사용하지 않기 위해 초기화
// DB에서 새로 가져오기 위해