본문 바로가기

개인적으로 공부한 것을 정리해 놓은 블로그입니다 틀린 것이 있으면 댓글 부탁 드립니다!


JPA

JPA 공부 14 - JPQL . 2 프로젝션

반응형

 

프로젝션

 

select 절에 조회할 대상을 지정하는 것 

- 프로젝션대상 : 엔티티 , 임베디드 타입 ,스칼라 타입(숫자 , 문자등 기본 데이터 타입)

 

엔티티

select  m from Member m

select m.team from Member m

 

임베디드 타입

 

select m.address from Memberm 

 

스칼라 타입 

 

select m.username, m.age from Member m 

 

 

반환타입이 엔티티 컬랙션 타입인경우 컬렉션안에 엔티티들이 모두 영속성 컨택스트 안에서 관리된다 .

 

Member member = new Member("user1" , 20);
            em.persist(member);

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

            List<Member> result = em.createQuery("select m from Member m where m.username = :username ", Member.class)
                    .setParameter("username", member.getUsername())
                    .getResultList();

            result.get(0).setAge(20);

result 안에 Member는 모두 영속성 컨텍스트 에서 관리됨.

 

 

join을 사용하는 경우에는 jpql에도 sql과 같이 조인문을 써주는 것이 좋다 .  그래야 명식적으로 조인이 나가는 쿼리구나 이해 할 수 있다. 

 

//이렇게만해도 sql 은 조인문으로 나가지만
List<Member> result1 = em.createQuery("select m.team from Member m ", Member.class)
						.getResultList();
                        
//명시적으로 조인문이 들어가는 쿼리라는 것을 알려주는 것이 좋다
List<Member> result2 = em.createQuery("select t from Member m join m.team t ", Member.class)       
						.getResultList();

 

 

스칼라 타입에서 여러 값을 조회하는 방법

 

            //스칼라 타입에서 값을 받는 방법
            em.createQuery("select m.username,m.age from Member m ")
                    .getResultList();

            //1. Object [] 타입으로 조회
            List<Object[]> resultList = em.createQuery("select m.username,m.age from Member m ")
                    .getResultList();

            Object[] objects = resultList.get(0);
            System.out.println("objects[0] = " + objects[0]);
            System.out.println("objects[1] = " + objects[1]);
            tx.commit();

            //2.new 명령어로 Dto 생성하여 조회

            List<MemberDto> memberDto = em.createQuery("select new JPQL.domain.MemberDto( m.username,m.age) from Member m ", MemberDto.class)
                    .getResultList();

            MemberDto memberDto1 = memberDto.get(0);
            System.out.println("memberDto1.getUsername() = " + memberDto1.getUsername());
            System.out.println("memberDto1.getAge() = " + memberDto1.getAge());

 

1.오브젝트 타입으로 받으면 안에 값들이 오브젝트 형식으로 들어간다 많이 사용하는 방식은 아니다.  

 

2.Dto를 생성해서 값을 바인딩 받는다  ,  편하지만 값을 담을 Dto를 생성할 때  패키지 명을 포함한 전체 클래스 명을 표기해야하는 불편함이 있다  , 순서와 타입이 일치하는 생성자가 필수다 . 

 

반응형

'JPA' 카테고리의 다른 글

JPA 공부 16 - JPQL . 4 JOIN  (0) 2021.06.06
JPA 공부 15 - JPQL . 3 페이징  (0) 2021.06.06
JPA 공부 14 - JPQL . 1  (0) 2021.06.06
JPA 공부 13 - 직접 쿼리를 작성하는 방법  (0) 2021.06.06
JPA 공부 12 - 값 타입 collection 사용  (0) 2021.06.06