[Spring Boot] Caused by: com.mysql.cj.exceptions.DataConversionException: Cannot determine value type from string 'b-4'

Benjamin·2022년 10월 28일
0

Troubleshooting

목록 보기
6/6

[ISSUE]

Spring Boot의 Dao에 MySQL에 접근하는 쿼리문을 적는다.

여기서 서브쿼리문을 사용하였는데, 'b-4'가 서브쿼리의 결과이기때문에 서브쿼리때문에 발생하는 문제로 추측한다.

Dao의 해당 코드

/*
     * 각 필터의 질문 가져오기 API
     */
    public GetQuestionRes getQuestion(String filterId, int userIdxByJwt){
        String getQuestionQuery = "select ID as qnaQuestionId ,CONTENTS as question, (select COUNT(*) from QUESTION where FILTER_ID = ? and ID NOT IN (select QNA_QUESTION_ID from POST where USER_ID = ? and FILTER_ID = ?)) as numberOfRemaning from QUESTION where FILTER_ID = ? and ID NOT IN (select QNA_QUESTION_ID from POST where USER_ID = ? and FILTER_ID = ?) ORDER BY RAND() LIMIT 1;";
        return this.jdbcTemplate.queryForObject(getQuestionQuery,
                (rs,rowNum) -> new GetQuestionRes(
                        rs.getInt("qnaQuestionId"),
                        rs.getString("question"),
                        rs.getInt("numberOfRemaning")),
                filterId, userIdxByJwt, filterId, filterId, userIdxByJwt, filterId);
    }

한방쿼리로 짜서, 쿼리문이 참 길다 ..ㅎㅎ

서브쿼리로 가져오는 ID NOT IN (select QNA_QUESTION_ID ~)에서 ID가 문제인것같다.

❓원래 서브쿼리의 값은 타입을 판별하지 못하는건가..?
이전에는 그러지않았던것같은데..

쿼리문을 분리하여 작성해보려던 순간, DTO를 확인하다가 문제를 발견하였다.

questionId는 DB에 String타입으로 들어가있는데, DTO에서도 int type으로 선언해두었고, Dao에도 rs.gerInt()로 받고있었다

[Solve]

💢Cannot determine value type
서브쿼리의 문제가아니라, DB의 타입과 코드의 타입이 불일치해서 발생하는 에러였구나!

DTO 파일 : int -> String 변경
Dao 파일 : rs.getInt() -> rs.getString() 변경

해결!!

배우고간다.

0개의 댓글