[Request processing failed: org.springframework.jdbc.UncategorizedSQLException: Error attempting to get column '컬럼명' from result set. Cause: java.sql.SQLException: 부적합한 열 유형: getBLOB not implemented for class oracle.jdbc.driver.T4CLongRawAccessor 오류 해결 하

2024. 10. 28. 10:32·Develop/Trouble Shooting
반응형

 

[Request processing failed: org.mybatis.spring.MyBatisSystemException] with root cause

java.sql.SQLException: 부적합한 열 유형: getBLOB not implemented for class oracle.jdbc.driver.T4CLongRawAccessor
	at oracle.jdbc.driver.GeneratedAccessor.getBLOB(GeneratedAccessor.java:1021) ~[ojdbc8-21.9.0.0.jar:21.9.0.0.0]
	at oracle.jdbc.driver.GeneratedStatement.getBLOB(GeneratedStatement.java:289) ~[ojdbc8-21.9.0.0.jar:21.9.0.0.0]
	at oracle.jdbc.driver.GeneratedScrollableResultSet.getBLOB(GeneratedScrollableResultSet.java:547) ~[ojdbc8-21.9.0.0.jar:21.9.0.0.0]
	at oracle.jdbc.driver.GeneratedScrollableResultSet.getBlob(GeneratedScrollableResultSet.java:136) ~[ojdbc8-21.9.0.0.jar:21.9.0.0.0]
	at oracle.jdbc.driver.GeneratedResultSet.getBlob(GeneratedResultSet.java:585) ~[ojdbc8-21.9.0.0.jar:21.9.0.0.0]
	at com.zaxxer.hikari.pool.HikariProxyResultSet.getBlob(HikariProxyResultSet.java) ~[HikariCP-5.1.0.jar:na]
	at org.apache.ibatis.type.BlobTypeHandler.getNullableResult(BlobTypeHandler.java:39) ~[mybatis-3.5.14.jar:3.5.14]
	at org.apache.ibatis.type.BlobTypeHandler.getNullableResult(BlobTypeHandler.java:28) ~[mybatis-3.5.14.jar:3.5.14]
	at org.apache.ibatis.type.BaseTypeHandler.getResult(BaseTypeHandler.java:86) ~[mybatis-3.5.14.jar:3.5.14]
	at org.apache.ibatis.type.UnknownTypeHandler.getNullableResult(UnknownTypeHandler.java:77) ~[mybatis-3.5.14.jar:3.5.14]
	at org.apache.ibatis.type.BaseTypeHandler.getResult(BaseTypeHandler.java:86) ~[mybatis-3.5.14.jar:3.5.14]
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.getPropertyMappingValue(DefaultResultSetHandler.java:530) ~[mybatis-3.5.14.jar:3.5.14]
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.applyPropertyMappings(DefaultResultSetHandler.java:495) ~[mybatis-3.5.14.jar:3.5.14]
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.getRowValue(DefaultResultSetHandler.java:418) ~[mybatis-3.5.14.jar:3.5.14]
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValuesForSimpleResultMap(DefaultResultSetHandler.java:366) ~[mybatis-3.5.14.jar:3.5.14]
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValues(DefaultResultSetHandler.java:337) ~[mybatis-3.5.14.jar:3.5.14]
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSet(DefaultResultSetHandler.java:310) ~[mybatis-3.5.14.jar:3.5.14]
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSets(DefaultResultSetHandler.java:202) ~[mybatis-3.5.14.jar:3.5.14]
	at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:66) ~[mybatis-3.5.14.jar:3.5.14]
	at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80) ~[mybatis-3.5.14.jar:3.5.14]
	at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65) ~[mybatis-3.5.14.jar:3.5.14]
	at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) ~[mybatis-3.5.14.jar:3.5.14]
	at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) ~[mybatis-3.5.14.jar:3.5.14]
	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) ~[mybatis-3.5.14.jar:3.5.14]
	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90) ~[mybatis-3.5.14.jar:3.5.14]
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) ~[mybatis-3.5.14.jar:3.5.14]
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) ~[mybatis-3.5.14.jar:3.5.14]
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) ~[mybatis-3.5.14.jar:3.5.14]
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) ~[mybatis-3.5.14.jar:3.5.14]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na]
	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425) ~[mybatis-spring-3.0.3.jar:3.0.3]
	at jdk.proxy2/jdk.proxy2.$Proxy63.selectOne(Unknown Source) ~[na:na]
	at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:160) ~[mybatis-spring-3.0.3.jar:3.0.3]
	at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:87) ~[mybatis-3.5.14.jar:3.5.14]
	at org.apache.ibatis.binding.MapperProxy$PlainMethodInvoker.invoke(MapperProxy.java:141) ~[mybatis-3.5.14.jar:3.5.14]
	at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:86) ~[mybatis-3.5.14.jar:3.5.14]




mybatis 이용하여 oracle database 

테이블에 데이터를 조회하는 기능을 개발하는 중에 
이미지 파일들이 있는 long row 컬럼이 있었는데 

단순하게 resultMap을 사용하여 
jdbcType을 LONGVARBINARY 로 선언하면 처리가 가능할 줄 알았으나 
jdbcType은insert나 update 같은 쿼리를 수행할 때는 MyBatis가 파라미터 타입을 명확히 인식할 수 있도록 jdbcType을 지정하는 경우 사용하는 것이니 나처럼 바보같은 실수는 하지 않길 바란다.. 😁


속성 설명
property 결과 칼럼에 매핑하기 위한 필드나 프로퍼티. 자바빈 프로퍼티가 해당 이름과 일치한다면 그 프로퍼티가 사용될 것이다. 반면에 마이바티스는 해당 이름이 필드를 찾을 것이다. 점 표기를 사용하여 복잡한 프로퍼티 검색을 사용할 수 있다. 예를들어 “username”과 같이 간단하게 매핑될 수 있거나 “address.street.number” 처럼 복잡하게 매핑될수도 있다.
column 데이터베이스의 칼럼명이나 별칭된 칼럼 라벨. resultSet.getString(columnName) 에 전달되는 같은 문자열이다.
javaType 패키지 경로를 포함한 클래스 전체명이거나 타입 별칭. 자바빈을 사용한다면 마이바티스는 타입을 찾아낼 수 있다. 반면에 HashMap으로 매핑한다면 기대하는 처리를 명확히 하기 위해 javaType 을 명시해야 한다.
jdbcType 지원되는 타입 목록에서 설명하는 JDBC 타입. JDBC타입은 insert, update 또는 delete 하는 null 입력이 가능한 칼럼에서만 필요하다. JDBC의 요구사항이지 마이바티스의 요구사항이 아니다. JDBC로 직접 코딩을 하다보면 null이 가능한 값에 이 타입을 지정할 필요가 있을 것이다.
typeHandler 이 문서 앞에서 이미 타입 핸들러에 대해 설명했다. 이 프로퍼티를 사용하면 디폴트 타입 핸들러를 오버라이드 할 수 있다. 이 값은 TypeHandler구현체의 패키지를 포함한 전체 클래스명이나 타입별칭이다.


그렇다면 long raw에 값을 어떻게 해야 잘 처리 할 수 있을까?

resultMap에서 아래 세가지 방법으로  처리 할 수 있다.

1. javaType을 byte[] 로 받는 방법
2. javaType을 String으로 받는 방법
3. typeHandler를 사용하는 방법

나는 로직을 한 곳에 집중 시키는 것을 좋아해서 3번을 추천한다.

그렇다면 typeHandler 는 어떻게 코드를 작성해야 할까?
아래는 long raw 값을 자바에서 받기 위한 typehandler 예시 코드이다.

package com.xxx.xxx.handler;

import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class LongRawHandler implements TypeHandler<byte[]> {

    @Override
    public void setParameter(PreparedStatement ps, int i, byte[] parameter, JdbcType jdbcType) throws SQLException {
        if (parameter != null) {
            ps.setBytes(i, parameter);
        } else {
            ps.setNull(i, java.sql.Types.LONGVARBINARY);
        }
    }

    @Override
    public byte[] getResult(ResultSet rs, String columnName) throws SQLException {
        return rs.getBytes(columnName);
    }

    @Override
    public byte[] getResult(ResultSet rs, int columnIndex) throws SQLException {
        return rs.getBytes(columnIndex);
    }

    @Override
    public byte[] getResult(CallableStatement cs, int columnIndex) throws SQLException {
        return cs.getBytes(columnIndex);
    }
}



 

해당 오류 덕분에 mybatis에 대해 더 자세히 알게 된 것 같다 :)

 

 



Ref.

https://stackoverflow.com/questions/31771198/message-invalid-column-type-getblob-not-implemented-for-class-oracle-jdbc-drive

 

Message Invalid column type: getBLOB not implemented for class oracle.jdbc.driver.T4CLongRawAccessor

I have a problem when trying to read blob from Oracle DB by using this rs.getBlob("ARCHIVE_REQ_FILE_BLOB") I also tried this oracle.sql.BLOB blob= (oracle.sql.BLOB) ((OracleResultSet) rs).

stackoverflow.com

 

https://mybatis.org/mybatis-3/ko/index.html

 

mybatis – 마이바티스 3 | 소개

마이바티스는 무엇인가? 마이바티스는 개발자가 지정한 SQL, 저장프로시저 그리고 몇가지 고급 매핑을 지원하는 퍼시스턴스 프레임워크이다. 마이바티스는 JDBC로 처리하는 상당부분의 코드와

mybatis.org

 

https://mybatis.org/mybatis-3/ko/sqlmap-xml.html

 

mybatis – 마이바티스 3 | 매퍼 XML 파일

Mapper XML 파일 마이바티스의 가장 큰 장점은 매핑구문이다. 이건 간혹 마법을 부리는 것처럼 보일 수 있다. SQL Map XML 파일은 상대적으로 간단하다. 더군다나 동일한 기능의 JDBC 코드와 비교하면

mybatis.org

 

반응형
저작자표시 비영리 (새창열림)

'Develop > Trouble Shooting' 카테고리의 다른 글

[Docker] 도커로 환경을 옮긴 후 셀레니움이 실행이 안되는 오류 해결  (3) 2025.04.24
[SpringBoot] When allowCredentials is true, allowedOrigins cannot contain the special value "*" since that cannot be set on the "Access-Control-Allow-Origin" response header. To allow credentials to a set of origins... 어쩌고저쩌고.. 오류 해결하기 🤔  (9) 2025.04.17
API 동시성 문제 개선하기 (MAX + 1 Key 채번)😡  (6) 2025.02.04
uncategorized SQLException; SQL state [99999]; error code [17056]; 지원되지 않는 문자 집합(클래스 경로에 orai18n.jar 추가): KO16KSC5601 에러 해결 방법! 🛠️  (2) 2024.08.30
'Develop/Trouble Shooting' 카테고리의 다른 글
  • [Docker] 도커로 환경을 옮긴 후 셀레니움이 실행이 안되는 오류 해결
  • [SpringBoot] When allowCredentials is true, allowedOrigins cannot contain the special value "*" since that cannot be set on the "Access-Control-Allow-Origin" response header. To allow credentials to a set of origins... 어쩌고저쩌고.. 오류 해결하기 🤔
  • API 동시성 문제 개선하기 (MAX + 1 Key 채번)😡
  • uncategorized SQLException; SQL state [99999]; error code [17056]; 지원되지 않는 문자 집합(클래스 경로에 orai18n.jar 추가): KO16KSC5601 에러 해결 방법! 🛠️
    반응형
  • 개발자는어디까지공부해야할까?
  • 전체
    오늘
    어제
    • 분류 전체보기 (51)
      • 인디해커 (1)
      • Develop (42)
        • Front-End (7)
        • Back-End (17)
        • Spring (1)
        • Tool (1)
        • DATABASE (1)
        • DevOps (7)
        • CS (3)
        • Trouble Shooting (5)
      • 다이소 (1)
        • 코딩테스트문제풀이 (1)
      • 변소 (7)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃허브(Github)
    • 개발 Feed
  • 공지사항

  • 인기 글

  • 태그

    타임리프 사용방법
    개발자 면접
    자바
    리그오브레전드
    mybatis
    Recoil
    spring
    스프링부트
    SpringBoot
    thymeleaf
    롤
    JavaScript
    node
    개발자
    jdk
    backend
    백엔드 개발자 면접 단골 질문 뿌시기
    @Scheduled
    Oracle
    fow.kr
    리액트
    Java
    github
    spring boot
    react-router-dom
    op.gg
    React
    lol
    셀레니움
    백엔드
  • 최근 댓글

  • 최근 글

  • 01-23 14:21
  • hELLO· Designed By정상우.v4.10.3
[Request processing failed: org.springframework.jdbc.UncategorizedSQLException: Error attempting to get column '컬럼명' from result set. Cause: java.sql.SQLException: 부적합한 열 유형: getBLOB not implemented for class oracle.jdbc.driver.T4CLongRawAccessor 오류 해결 하
상단으로

티스토리툴바