에러 발생 : Cause: org.apache.ibatis.type.TypeException: Error setting null parameter. Most JDBC drivers require that the JdbcType must be specified for all nullable parameters. Cause: java.sql.SQLException: 부적합한 열 유형
- 부적합한 열 유형 1111 에러가 발생했다.
- SPRING에서 my-batis를 이용하여 Insert, Update를 할 때 넣어줄 파라미터 #이 null 일 경우 에러가 발생한다.
- 방법은 2가지였다.
1. my-batis 설정 파일에 settings 추가하기
<settings>
<setting value="VARCHAR" name="jdbcTypeForNull">
</settings>
-
jdbcType에 설정할 수 있는 값은 다음과 같다.
BIT
FLOAT
CHAR
TIMESTAMP
OTHER
UNDEFINED
TINYINT
REAL
VARCHAR
BINARY
BLOB
NVARCHAR
SMALLINT
DOUBLE
LONGVARCHAR
VARBINARY
CLOB
NCHAR
INTEGER
NUMERIC
DATE
LONGVARBINARY
BOOLEAN
NCLOB
BIGINT
DECIMAL
TIME
NULL
CURSOR
-
properties 보다 아래, typeAlias보다 위에 작성하면 된다고 한다. 내가 해본 결과 무한 로딩이 걸려 실패 !
2. 각 파라미터 값에 jdbcType 설정하기
<update id='saveBoard'>
INSERT INTO boardTable(title, board_id)
VALUES(#{title, jdbcType=VARCHAR}, #{boardId,jdbcType=INTEGER})
</update>
그래서 해결한 방법은
- 이 에러가 발생한 이유가 글을 등록하고 수정하는 기능을 글을 저장하는 기능 하나로 보고 작업해서 saveRequest라는 DTO를 parameter 값으로 받고 있었다.
- 오라클의 merge into를 사용해서 글의 id(number형) 가 존재하면 수정, 존재하지 않으면 새 글 등록으로 작동하게 된다.
- 그런데 등록할 때는 작성자의 아이디가 필요하니 데이터를 담아서 오는데, 수정할 땐 이미 있는 정보니 따로 넣어주질 않아 null 값인 상태로 들어오게 되었던 것
- 아직 공부하는 학생이라 정답은 아닐 수도 있고, 또 이게 최선은 아니라고 생각은 하지만 결국 비어있는 값을 채워주면 된다고 생각했고 , hidden으로 빈 값들을 채워서 넘겨 받으니 에러가 해결되었다.
reference!
https://mine-it-record.tistory.com/263