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