nativeQuery = false일 때 복잡한 Query를 사용해보려 했는데
서브쿼리가 포함되면 자꾸 에러가 나서...
nativeQuery를 사용해보려고 했는데
컬럼 하나만을 조회할 때는 int, String 등등 잘 맵핑이 됐는데
원하는 Dto로 조회하려니
Object로는 조회가 되지만 원하는 Dto에 맵핑하기가 어려웠다.
✏️ nativeQuery = true일 때 Dto로 받고 싶다면?
- 우선 Object로 조회가 되는지 확인
- 잘 나온다면! 원하는 Dto에 맵핑을 하자
Dto로 맵핑하기 위해 컬럼 하나하나를 뽑아 써야하므로 조회 결과에 따라 Object의 타입을 조절한다
나는 배열의 List 형태라서 Object → List<Object[]>로 변형했다.
List<Object[]> objectList = boardRepository.getBoardImages(page, size, longImo);
List<BoardImgRequestDto> boardImgRequestDtoList = new ArrayList<>();
for (Object[] object : objectList) {
BoardImgRequestDto boardImgRequestDto = new BoardImgRequestDto(object);
boardImgRequestDtoList .add(boardImgRequestDto);
}
boardImgRequestDtoList : 최종으로 return 할 List
Object[] object : objectList : List<object[]>에서 for문으로 Object[] 빼서 쓰기
BoardImgRequestDto(object); : boardImgRequestDtoList에넣을 Dto (위에서 빼온 object로 생성)
boardImgRequestDto : object로 생성한 BoardImgRequestDto를 boardImgRequestDtoList 에 넣음
- 생성자에서 형변환
BoardImgRequestDto boardImgRequestDto = new BoardImgRequestDto(object);
public BoardImgRequestDto(Object[] object) {
this.Id = ((BigInteger) object[0]).longValue();
this.imgUrl = (String) object[1];
}
Object[] object : object의 배열마다 형변환이 필요함
((BigInteger) object[0]).longValue() : 타입이 Long인 경우 DataBase에서 BigInteger로 저장되므로 object를 BigInteger로 형변환한 후 그 값을 long으로 가져온다.
(String) object[1] : varchar타입은 String으로 형변환 후 바로 가져올 수 있다.
✏️ 근데... 데이터가 이상하다?!
'개발일기 > Java' 카테고리의 다른 글
CommandAcceptanceException 해결 (0) | 2023.04.12 |
---|---|
nativeQuery select in 적용하기 (0) | 2023.04.11 |
nativeQuery 사용법 (0) | 2023.04.11 |
IntelliJ 테스트 코드 한글 깨짐 현상 해결 (0) | 2023.03.30 |
JPA Query 사용하기 (0) | 2023.03.23 |