본문으로 바로가기

springboot, postgresql , mybatis를 사용하던중 아래의 이슈사항이 있었고 해결함.

CREATE OR REPLACE FUNCTION public.test_function(
                         , aList character varying[]
                         , b character varying
                         )

    RETURNS TABLE(
                    c character varying
                  , d character varying
                 )

    LANGUAGE plpgsql
AS $function$

declare
 .....................
public class TestEntity {
    private String[] aList;
    private String   b;
}
 <select id="getFunction" parameterType="TestEntity" resultType="TestEntityResult">
        SELECT a
             , b
          FROM test_function(#{aList},#{b})
 </select>

mybatis를 사용할때 entity의 값을 대입하기 위해서는 entity의 필드명을 가지고 #{필드명}으로 사용한다.

그렇게 사용하던 와중 function을 개발하였고 호출을 평상시에 하던대로 했는데 아래와 같은 에러가 발생했다.

 

Cause: java.lang.IllegalStateException: Type handler was null on parameter mapping for property 'TestEntity'.

It was either not specified and/or could not be found for the javaType ([Ljava.lang.String;) : jdbcType (null) combination.

 

검색해본 결과 의외로 단순했다. 아래의 코드처럼 typeHandler를 지정해주면 해결되었다.

 <select id="getFunction" parameterType="TestEntity" resultType="TestEntityResult">
        SELECT a
             , b
          FROM test_function(
                              #{aList,typeHandler=org.apache.ibatis.type.ArrayTypeHandler}
                             ,#{b}
                             )
 </select>

 

이외에도 많은 typeHandler가 있으니 apiDocs 보는것을 추천한다.

https://mybatis.org/mybatis-3/apidocs/reference/org/apache/ibatis/type/ArrayTypeHandler.html