JPA(JPQL, 프로젝션, 페이징API

jhwan·2024년 11월 30일
  1. JPQL
  • 테이블이 아니라 엔티티 객체를 대상으로 쿼리한다.
  1. TypeQuery, Query
    TypeQuery : 반환 타입이 명확할 때 사용
    Query : 반환 타입이 명확하지 않을 때 사용
 // 반환 타입이 명확할 때
 TypedQuery<Member> query =
 em.createQuery("SELECT m FROM Member m", Member.class);
 List<Member> members = query.getResultList();
 
 // 동적 쿼리 바인딩
 TypedQuery<Member> query =
 em.createQuery("SELECT m FROM Member m WHERE m.username = :username", Member.class);
 query.setParameter("username", "member1");
 
 // 반환 타입이 명확하지 않을 때
 Query query =
 em.createQuery("SELECT m.username, m.age from Member m"); 
  1. 프로젝션
  • SELECT m FROM Member m : 엔티티 프로젝션, 영속성 컨텍스트에서 관리됨
  • SELECT m.address FROM Member m : 임베디드 타입 프로젝션
  • SELECT m.username, m.age FROM Member m : 스칼라 타입 프로젝션
    스칼라 타입 반환 할 때
    (1)DTO로 바로 조회
        try{

            Member member = new Member();
            member.setUsername("정환");
            member.setAge(37);
            em.persist(member);

            TypedQuery<MemberDTO> query = em.createQuery("select new hellojpa.jpql.MemberDTO(m.username, m.age) from Member m", MemberDTO.class);
            List<MemberDTO> resultList = query.getResultList();


            System.out.println("====================");
            for(MemberDTO hello : resultList){
                System.out.println(hello.toString());
            }
            System.out.println("====================");

            tx.commit();
        }

4.페이징 API

            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.toString() = " + member1.toString());
            }
  1. 조인

내부 조인: 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

0개의 댓글