페이징, 조인
페이징
List<Member> result = em.createQuery("select m from Member m order by m.age desc", Member.class).
.setFirstResult(1) // 시작
.setMaxResults(10) // 몇 개 가져올지
.getResultList();
페이징 쿼리가 네이티브 sql보다 훨씬 간편하게 나온다.
MySQL로 따진다면
SELECT
M.ID AS ID
M.AGE AS AGE,
M.TEAM_ID AS TEAM_ID,
M.NAME AS NAME
FROM
MEMBER M
ORDER BY
M.NAME DESC LIMIT ?, ?
위와 같은 쿼리가 나가는 것이다.
조인
• 내부 조인:
- SELECT m FROM Member m [INNER] JOIN m.team t
• 외부 조인:
- SELECT m FROM Member m LEFT [OUTER] JOIN m.team t
• 세타 조인:
- select count(m) from Member m, Team t where m.username = t.name
Team team = new Team();
team.setName("teamA");
Member member = new Member();
member.setUsername("member1");
member.setAge(10);
member.setTeam(team);
String query = "select m from Member m inner join m.team t where t.name : teamName";
List<Member> result = em.createQuery(query, Member.class)
..setParameter("teamName", "1팀")
.getResultList();
join을 사용한 예시이다. 위의 코드처럼 JPQL에서 join을 사용하면 된다.
외부 조인은 team이 없더라도 member가 조회가 되는 것이고, 세타 조인은 member와 team 을 전부 가져와서 조인하는 것이다.
세타 조인은 "select m from Member m, Team t where m.username = t.teamName" 등으로 사용
(사용자 이름과 팀 이름이 같다는 이상한 조건의 쿼리 등이 필요할 때 사용함)
조인 - ON 절
1. 조인 대상 필터링
예) 회원과 팀을 조인하면서, 팀 이름이 A인 팀만 조인
JPQL:
SELECT m, t FROM Member m LEFT JOIN m.team t on t.name = 'A'
SQL:
SELECT m.*, t.* FROM
Member m LEFT JOIN Team t ON m.TEAM_ID=t.id and t.name='A'
2. 연관관계 없는 엔티티 외부 조인 (세타 조인과 비슷)
예) 회원의 이름과 팀의 이름이 같은 대상 외부 조인
JPQL:
SELECT m, t FROM
Member m LEFT JOIN Team t on m.username = t.name
SQL:
SELECT m.*, t.* FROM
Member m LEFT JOIN Team t ON m.username = t.name
ON절을 사용해서 위와 같이 조건을 통해 원하는 값만 SELECT 할 수도 있다.