QLRM 라이브러리로 NativeQuery

Legday_Dev·2023년 9월 18일
0

Spring

목록 보기
12/14
post-thumbnail

QLRM 은 DB에서 나온 결과를 Java 클래스에 매핑해주는 라이브러리이다 !

  • pom.xml 에 추가해주면 된다.
<!-- qlrm -->
<dependency>
	<groupId>org.qlrm</groupId>
	<artifactId>qlrm</artifactId>
	<version>2.1.1</version>
</dependency>

QLRM 을 이용한 Native Query 짜기


  • @Query 어노테이션을 사용하여 JpaRepository 구현체에서 쓰는 방법이 아닌 실제 로직이 돌아가는 코드에서 사용하는 예시이다.
  • 이유는 JpaRepository<T, ID> 에서 T 는 엔터티만 반환하는데 엔터티가 아닌 DTO 를 반환하면 따로 구현해야 한다 !
  • 예를 들어 구독정보 리스트를 반환해주는 기능이라고 하자.
    • 실제 쿼리문을 한줄한줄 잘라서 StringBufferappend() 메서드로 담아준다(줄 마지막에 띄어쓰기 해주자!)
    • 변수가 들어가는 부분은 ? 로 바꿔준다.
    • javax.persistence 가 제공하는 Query 클래스로 NativeQuery를 생성하고 파라미터바인딩을 해준다.
    • QLRM 라이브러리가 제공하는 JpaResultMapper 를 선언해주고 쿼리 반환값이 다량이므로 list() 메서드로 담아준다. 첫번째 파라미터는 쿼리 , 두번째 파라미터는 반환 타입을 적어주면 된다.
    • 반환값이 단건인 쿼리면 uniqueResult() 메서드를 실행하면 된다.
public List<SubscribeDto> 구독리스트(int principalId, int pageUserId) {
    // 쿼리 세팅
    StringBuffer sb = new StringBuffer();
    sb.append("SELECT u.id , u.username, u.profileImageUrl, ");
    sb.append("if((SELECT 1 FROM subscribe WHERE fromUserId = ? AND toUserId = u.id),1,0) as subscribeState, "); // ? : principalId
    sb.append("if((CASE u.id WHEN ? THEN 1 else 0 end),1,0) as equalUserState "); // ? : principalId
    sb.append("FROM user u INNER JOIN subscribe s ");
    sb.append("ON u.id = s.toUserId ");
    sb.append("WHERE s.fromUserId = ?"); // ? : pageUserId

    // 쿼리 완성
    Query query = em.createNativeQuery(sb.toString())
            .setParameter(1, principalId)
            .setParameter(2,principalId)
            .setParameter(3,pageUserId);

    // 쿼리 실행(QLRM 라이브러리 필요)
    JpaResultMapper result = new JpaResultMapper();
    List<SubscribeDto> subscribeDtos = result.list(query, SubscribeDto.class);

    return subscribeDtos;
}

JPA 를 활용한 프로젝트를 할 때에 엔터티를 반환하는 쿼리는 JpaRepository 를 사용하고 그외에 DTO를 반환하면 따로 Native Query 를 로직에 적어서 실행하자 !

profile
백엔드개발자

0개의 댓글