구독 정보 뷰 랜더링
전에서 짰던 쿼리를 통해서 모달에 데이터를 뿌려줄거다.
if문을 추가해서 true면 1 아니면 0이 오도록 추가 수정해줬다
-- 동일 유저인지 판단 여부
SELECT u.id,
u.username,
u.profileImageUrl,
if((SELECT 1 FROM Subscribe WHERE fromUserId = 1 AND toUserId = u.id),1,0) subscribeState,
if((1=u.id),1,0) equalUserState
FROM User u INNER JOIN Subscribe s
ON u.id = s.toUserId
WHERE s.fromUserId = 2;
SQL
복사
SubscribeRepository에 이 쿼리를 넣을수는 없다
리턴되는 타입(u.id , u.username ..등등)이 Subscribe이 아니기 때문이다
그래서 SubscribeService에서 직접 네이티브 쿼리를 짤거다
private final EntityManager em; //Repository는 EntityManager를 구현해서 만들어져 있는 구현체
@Transactional(readOnly = true)
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 = 1 AND toUserId = u.id),1,0) subscribeState, ");
sb.append("if((1=u.id),1,0) equalUserState ");
sb.append("FROM User u INNER JOIN Subscribe s ");
sb.append("ON u.id = s.toUserId ");
sb.append("WHERE s.fromUserId = 2 "); //세미클론 첨부하면 안됨.
return null;
}
Java
복사
꼭 뒤에 한칸씩 띄어줘야한다. 안그러면은 다음줄 쿼리문하고 붙어서 실행되기 때문에 띄어쓰기하는 습관을 가져주자.
import javax.persistence.Query;
@Transactional(readOnly = true)
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) subscribeState, ");
sb.append("if((?=u.id),1,0) equalUserState ");
sb.append("FROM User u INNER JOIN Subscribe s ");
sb.append("ON u.id = s.toUserId ");
sb.append("WHERE s.fromUserId = ? "); //세미클론 첨부하면 안됨.
//1. 물음표 principalId
//2. 물음표 principalId
//3. 마지막 물음표 페이지아이디
//쿼리 완성
Query query = em.createNativeQuery(sb.toString())
.setParameter(1, principalId)
.setParameter(2, principalId)
.setParameter(3, pageUserId);
return null;
}
Java
복사
쿼리 실행까지 추가해줄건데
단건으로 가져올때는 밑에 유니크리절트쓰면 되고 지금 우린 list로 가져올거기 때문에 상단껄로 쓰면 된다.
//쿼리 실행
JpaResultMapper result = new JpaResultMapper();
List<SubscribeDto> subscribeDtos = result.list(query, SubscribeDto.class);
return subscribeDtos;
Java
복사
JpaResultMapper라는건 import 한걸 보면은
import org.qlrm.mapper.JpaResultMapper;
Java
복사
qlrm이라는건데 이건 스프링부트에서 제공하는 라이브러리가 아니라
pom.xml 에
<!-- qlrm -->
<dependency>
<groupId>org.qlrm</groupId>
<artifactId>qlrm</artifactId>
<version>2.1.1</version>
</dependency>
Java
복사
등록해서 사용하고 있는거다.
qlrm은 데이터베이스에서 리절트된 결과를 자바클래스에 매핑해주는 라이브러리다.
@Transactional(readOnly = true)
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) subscribeState, ");
sb.append("if((?=u.id),1,0) equalUserState ");
sb.append("FROM User u INNER JOIN Subscribe s ");
sb.append("ON u.id = s.toUserId ");
sb.append("WHERE s.fromUserId = ? "); //세미클론 첨부하면 안됨.
//1. 물음표 principalId
//2. 물음표 principalId
//3. 마지막 물음표 페이지아이디
//쿼리 완성
Query query = em.createNativeQuery(sb.toString())
.setParameter(1, principalId)
.setParameter(2, principalId)
.setParameter(3, pageUserId);
//쿼리 실행(qlrm 라이브러리 필요 -> DTO에 DB 결과를 매핑하기 위해서)
JpaResultMapper result = new JpaResultMapper();
List<SubscribeDto> subscribeDtos = result.list(query, SubscribeDto.class);
return subscribeDtos;
}
Java
복사
포스트맨에서 테스트를 해보자
ssar로 먼저 포스트맨에서 로그인하고
이제 이 정보를 리턴받아서 모달에 뿌려주면 된다