QLRM 은 DB에서 나온 결과를 Java 클래스에 매핑해주는 라이브러리이다 !
<!-- qlrm -->
<dependency>
<groupId>org.qlrm</groupId>
<artifactId>qlrm</artifactId>
<version>2.1.1</version>
</dependency>
@Query
어노테이션을 사용하여 JpaRepository
구현체에서 쓰는 방법이 아닌 실제 로직이 돌아가는 코드에서 사용하는 예시이다.JpaRepository<T, ID>
에서 T 는 엔터티만 반환하는데 엔터티가 아닌 DTO 를 반환하면 따로 구현해야 한다 !StringBuffer
에 append()
메서드로 담아준다(줄 마지막에 띄어쓰기 해주자!)javax.persistence
가 제공하는 Query
클래스로 NativeQuery
를 생성하고 파라미터바인딩을 해준다.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 를 로직에 적어서 실행하자 !