ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 페이징, 조인
    JPA/JPQL 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 할 수도 있다.

    '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
Designed by Tistory.