Cute Running Puppy
본문 바로가기
개발일기/Java

nativeQuery 원하는 Dto로 가져오기

by 징구짱 2023. 4. 11.
728x90

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로 생성한 BoardImgRequestDtoboardImgRequestDtoList 에 넣음

 

 

  • 생성자에서 형변환

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으로 형변환 후 바로 가져올 수 있다.

 

 

 

 

 

✏️ 근데... 데이터가 이상하다?!

https://pingu514.tistory.com/68

 

nativeQuery select in 적용하기

nativeQuery를 사용하여 select in 과 page를 를 적용시켜보았다 분명 직접 조회했을 때는 마지막 데이터가 72였는데 왜 select in 에 들어갈 값의 순서가 바뀔때 마다 데이터도 달라지는건지 ..? 저 path값

pingu514.tistory.com

728x90

'개발일기 > 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