즉, "몇 번째 부터 몇개 가져올래"
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();
}
}
페이징에서 order by가 꼭 들어가야 제대로 작동하고 있는지 알 수 있습니다.
정렬이 되면서 순서대로 가져와야 하기 때문입니다.
0번째 부터 10개 가져오겠다는 뜻입니다.
.setFirstResult(0)
.setMaxResults(10)
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();
}
}