완벽한 장면 2023. 8. 30. 11:45

페이징 API

  • order by 가 꼭 들어가야 Sorting이 되면서 페이징이 제대로 되는지 확인 가능하므로 중요하다.

 

 

예제

 

일단 귀찮으니 Member에 toString() 만들고 시작.

  @Override
  public String toString() {
    return "Member{" +
        "id=" + id +
        ", username='" + username + '\'' +
        ", age=" + age +
        '}';
  }

 

JpaMain

public class JpqlMain {

  public static void main(String[] args) {
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
    EntityManager em = emf.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(); // 비움

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

      System.out.println("result.size = " + result.size());

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

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

}

 

실행하면

      List<Member> result = em.createQuery("select m from Member m order by m.age desc",
              Member.class)
          .setFirstResult(1) // 여기에 숫자를 주면

          .setMaxResults(10)
          .getResultList();

 

offset 이 생긴다.

 

현재는 데이터가 안 나오므로 루프로 코드를 좀 바꿔서 다시 실행한다.

    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.size = " + result.size());

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

      tx.commit();
    }

 

실행 결과를 보면

정렬 확인 가능

지금은 H2 데이터베이스 방언으로 설정이 되어 있음.

 

H2 Dialect를 보고 쿼리가 실행될 때에는 기본적으로 엔티티 매핑 정보와 Dialect 정보를 합쳐서 쿼리가 나간다.

 

그냥 간단하게 .setFirstResult() 와 .setMzxResult() 만 알맞게 쓰면 된다고 생각하고 있으면 된다.

 

예시

1. 페이징 API - MySQL 방언

 

2. 페이징 API - Oracle 방언

 

 

728x90
반응형