JPA/JPQL

페이징, 조인

chanhee01 2023. 7. 14. 00:05

페이징

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 할 수도 있다.