Trouble Shooting

QLRM 네이티브 쿼리 DTO type 오류

민뭉아치 2022. 4. 14. 16:24

1. 문제 사항

쿼리문을 실행 시, qrlm 라이브러리를 사용하여 DB의 결과를 DTO와 맵핑하는 과정에서 오류가 발생했다.

 

Service

...
JpaResultMapper result = new JpaResultMapper();
List<SubscribeDto> subscribeDtoList = result.list(query, SubscribeDto.class);
...

SubscribeDto

@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
public class SubscribeDto {
    private Long id;
    private String username;
    private String profileImageUrl;
    private Long subscribeState;
    private Long equalUserState;
}

 

 

2. 원인

UserEntity 생성 시, id의 타입을 Long 설정하니 MySQL에서 id의 타입을 확인해 본 결과 BIGINT로 설정되었다.

MySQL

MySQL 데이터 타입과 Java 데이터 타입이 맞지않아 발생한 오류 같다.

MySQL의 BIGINT 데이터 타입은 Java에서 Long 또는 BigInteger 타입과 비교할 수 있다.

DTO의 타입을 Long으로 받았지만 오류가 발생한걸 보면 Unsigned라서 BigInteger을 받아야 하나보다.

 

 

3. 해결

DTO에서 BigInteger로 받아주니 잘 작동한다.

@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
public class SubscribeDto {
    private BigInteger id;
    private String username;
    private String profileImageUrl;
    private BigInteger subscribeState;
    private BigInteger equalUserState;
}

 

 

4. 참고

 

MySQL 데이터 타입 Java 데이터 타입 비교

TINYINT Integer BIT Boolean BOOL/BOOLEAN (TINYINT(1)) Integer SMALLINT Unsigned 상관없이 Integer MEDIUMINT Integer, Unsinged라면 Long INT Integer, Unsigned라면 Long BIGINT Long, Unsigned라면 java.ma..

goldfishhead.tistory.com