페이징 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