-
페이징
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.nameTeam 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.nameON절을 사용해서 위와 같이 조건을 통해 원하는 값만 SELECT 할 수도 있다.
'JPA > JPQL' 카테고리의 다른 글
경로 표현식 (0) 2023.08.09 조건식 (CASE) (0) 2023.07.14 서브 쿼리 (0) 2023.07.14 프로젝션(SELECT) (0) 2023.07.13 JPA에서의 쿼리 언어들 (0) 2023.07.13