상세 컨텐츠

본문 제목

[JPQL] 기초

프로젝트 일기

by 성찬우 2023. 6. 9. 01:29

본문

우선 내가 사용하는 테이블의 경우 chat_room에 있는 idx를 각각 테이블이 가지고 있다. 

 

한번 호출해보자 controller에서 간단하게 테스트 하면서 디버깅을 찍어보자 

 

@RestController
@RequestMapping(value = "/")
public class TravelController {

    @PersistenceContext
    private EntityManager entityManager;

    @GetMapping("/")
    public void test(){
        String jpql = "select 별칭 from ChatRoomGroup 별칭";
        TypedQuery<Object[]> query = entityManager.createQuery(jpql, Object[].class);
        List<Object[]> resultList = query.getResultList();
        for (Object[] result : resultList) {
            ChatRoomGroup a = (ChatRoomGroup) result[0];
        }
        
    }
}

자 "Object리스트+리스트"로 resultList변수에 결과값을 받아왔다. 어떤 값들이 있을까?

 

현재 ChatRoomGroup에는 2개의 row가 존재하는데 이렇게 

0, 1로 2개를 가져온다. forEach 문으로 각각 가져와서 가장 첫번째꺼를 ChatRoomGroup으로 형변환을 시켜서 가져오게 된다. 당연히 ChatRoomGroup 테이블에서 가져온 값들이기 때문에 castException은 발생하지 않는다. 

 


그러면 한번 추가적인 조건을 넣어보자 

        String jpql = "select chatRoomGroup from ChatRoomGroup chatRoomGroup " +
                "where chatRoomGroup.chatRoomGroupIdx = :custom";
        TypedQuery<Object[]> query = entityManager.createQuery(jpql, Object[].class);
        query.setParameter("custom", 1L);

custom 그냥 본인이 정한 변수값이라 생각하면 된다.

이제 custom 이라는 값에 1L을 넣어서  (chatRoomGroupIdx가 1L인 값) getResultList();를 받아보자 

이렇게 하나의 객체를 받아올 수 있다. 

 


이제 여기서 의문이 생긴다. " 왜 객체를 받아와? 너무 무거워; 아무리 객체 지향적으로 쿼리를 짠다지만 이건좀; "

그래서 이제 하나의 값만 받아올 수 있도록 할 수있다.  

 

String jpql = "select chatRoomGroup.userId from ChatRoomGroup chatRoomGroup " +
        "where chatRoomGroup.chatRoomGroupIdx = :custom";
Query query = entityManager.createQuery(jpql, Object[].class);
query.setParameter("custom", 1L);
Object resultList = query.getSingleResult();
System.out.println(resultList);

 

보면

TypedQuery<Object[]>

에서 Query로 바뀐것을 볼 수 있다. 

당연히 resultList 변수값도 Object객체가 되겟다. 

 

결과값은 당연히 qhsghd이 나와야할것이고 

제대로 나오는 것을 확인 할 수 있다. 

 


 

자 다시한번 db형태를 보자 이제 특정 내가 원하는 테이블을 가져다가 사용할 수 있게 되었다. 

하지만 만약에 조인을 하고싶다면 어떻게 해야하고 그리고 어떻게 결과값이 나올까?

 

Left Join을 chat_room과 chat_message를 해보면서 예시를 보자 

 

        String jpql = "select cr from ChatRoom cr " +
                "LEFT JOIN cr.chatMessages cm " +
                "on cm.chatRoomIdx.chatRoomIdx = 1L";

        TypedQuery<Object[]>  query = entityManager.createQuery(jpql, Object[].class);
        List<Object[]> resultList = query.getResultList();
        for (Object[] result : resultList) {
            ChatRoom a = (ChatRoom) result[0];
            System.out.println(a);
        }

쿼리문을 보자.

cr이라는 ChatRoom 엔티티에 선언 되어있는 chatMessage객체 chatMessages라는 변수명을 가지고있겠죠? 이것을 cm이라고 칭할것이며 

cm이 가지고있는 chatRoom객체(변수명: chatRoomIdx)의 chatRoomIdx가 1인 애들과 조인 할것이다

라고 해석할 수 있다. 

 

한번 결과 값을 보자 

이렇게 join이 되는데 chatRoomIdx가 1L인 애가 chatMessages를 긁어왔다. 당연히 밑에 Object[1]객체들도 다 같은 값이다. 

 

 

'프로젝트 일기' 카테고리의 다른 글

[DOCKER] 배포  (0) 2023.06.06
[ JPA ] CriteriaBuilder  (0) 2023.06.01
P들의 여행 스타트  (0) 2023.05.09

관련글 더보기

댓글 영역