페이징 API

즉, "몇 번째 부터 몇개 가져올래"

페이징 API 예시

public class JpaMain_3 {

    public static void main(String[] args) {
        EntityManagerFactory enf = Persistence.createEntityManagerFactory("hello");

        EntityManager em = enf.createEntityManager();

        EntityTransaction tx = em.getTransaction();
        tx.begin();

        try {

            Member member = new Member();
            member.setUsername("member1");
            member.setAge(10);
            em.persist(member);

            em.flush();
            em.clear();

						//...1
            List<Member> result = em.createQuery("select m from Member m order by m.age desc", Member.class)
                    .setFirstResult(0) //...2
                    .setMaxResults(10)
                    .getResultList();

            System.out.println("result = " + result.size());
            for (Member member1 : result) {
                System.out.println("member1 = " + member1); //...3
            }

            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            em.close();
        }
        enf.close();

    }
}
  1. 페이징에서 order by가 꼭 들어가야 제대로 작동하고 있는지 알 수 있습니다.

    정렬이 되면서 순서대로 가져와야 하기 때문입니다.

  2. 0번째 부터 10개 가져오겠다는 뜻입니다.

    .setFirstResult(0)
    .setMaxResults(10)
    
  3. member의 값을 찍어볼텐데 귀찮으니 toString을 만듭니다.

    이 때 team 같은 경우 양방향 입니다. 그렇기 때문에 team 관련해서 지워주는게 좋습니다. Team과 Member에 toString이 서로 있다면 무한참조 때문에 스택 오버플로우 에러가 발생합니다.

    → 양방향 매핑시 주의점 자세히

데이터를 추가해서 확인해보겠습니다.

public class JpaMain_3 {

    public static void main(String[] args) {
        EntityManagerFactory enf = Persistence.createEntityManagerFactory("hello");

        EntityManager em = enf.createEntityManager();

        EntityTransaction tx = em.getTransaction();
        tx.begin();

        try {

            for (int i = 0; i < 100; i++) {
                Member member = new Member();
                member.setUsername("member" + i);
                member.setAge(i);
                em.persist(member);
            }

            em.flush();
            em.clear();

            List<Member> result = em.createQuery("select m from Member m order by m.age desc", Member.class)
                    .setFirstResult(1)
                    .setMaxResults(10)
                    .getResultList();

            System.out.println("result = " + result.size());
            for (Member member1 : result) {
                System.out.println("member1 = " + member1);
            }

            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            em.close();
        }
        enf.close();

    }
}

Untitled