Как передать аргументы как CLOB в mybatis при использовании функций оракула?

Я пытаюсь поместить длинную WKT (длинную строку о географической информации) в пространственную функцию оракула SDO_GEOMETRY, чтобы преобразовать WKT в тип геометрии оракула, используя mybatis. В базе данных нет столбца, в котором хранится WKT, он используется только как параметр в указанной функции. Тип элемента java - String, когда я пытаюсь вставить его, он возвращает ошибку, говоря, что строка слишком длинная. Это указывает на то, что строка не преобразуется в CLOB. Как я могу это сделать?

Я попытался использовать это в начале файла mybatis .xml:

<resultMap type="example.Building" id="BaseResultMap">
        <result property="geom" column="geom" jdbcType="CLOB"
                javaType = "java.lang.String"  typeHandler ="example.Utils.OracleClobTypeHandler"/>
    </resultMap>

и у меня настроен класс OracleClobTypeHandler.

Я также пытался использовать #{wkt,jdbcType=CLOB}, но это ни к чему не привело.

РЕДАКТИРОВАТЬ: это метод SetParameter в OracleClobTypeHandler:

    @Override
    public void setParameter(PreparedStatement arg0, int arg1, Object arg2, JdbcType arg3) throws SQLException {
        CLOB clob = CLOB.getEmptyCLOB();
        clob.setString(1, (String) arg2);
        arg0.setClob(arg1, clob);
    }

person John_Doe    schedule 29.05.2019    source источник
comment
Не отвечая на ваш вопрос напрямую, но есть функция Oracle sdo_util.from_wktgeometry(), которая принимает строку WKT и возвращает sdo_geometry.   -  person Rene    schedule 29.05.2019
comment
<resultMap /> не имеет значения, поскольку используется при сопоставлении результата запроса с объектом Java. Вы пытались указать typeHandler в ссылке на параметр, например. #{wkt,typeHandler=example.Utils.OracleClobTypeHandler} ? Кстати, если это внутренний класс, на него следует ссылаться как example.Utils$OracleClobTypeHandler. Если это все еще не работает, пожалуйста, опубликуйте полную трассировку стека.   -  person ave    schedule 29.05.2019
comment
@ave Я попробовал то, что вы сказали, и трассировка стека org.springframework.jdbc.UncategorizedSQLException: Could not set parameters for mapping: ParameterMapping{property='wkt', mode=IN, javaType=class java.lang.String, jdbcType=CLOB, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}. Cause: java.sql.SQLException: Invalid empty lob operation. ; uncategorized SQLException; SQL state [99999]; error code [17098]; Invalid empty lob operation.; nested exception is java.sql.SQLException: Invalid empty lob operation.   -  person John_Doe    schedule 30.05.2019
comment
@ave Проблема решена, это ошибка в TypeHandler, я изменил oracle.sql.CLOB на java.sql.Clob и внес другие изменения, и тогда это сработало. Вы должны опубликовать свой комментарий в качестве ответа, чтобы я мог его принять.   -  person John_Doe    schedule 30.05.2019
comment
@John_Doe Рад узнать, что проблема решена! Я опубликовал свой комментарий в качестве ответа, но не стесняйтесь публиковать свои выводы в качестве нового ответа и принимать его самостоятельно, если он может быть более полезным. :)   -  person ave    schedule 30.05.2019


Ответы (1)


<resultMap /> не имеет значения, так как используется при сопоставлении результата запроса с объектом Java.
Попробуйте указать typeHandler в ссылке на параметр. например,
#{wkt,typeHandler=example.Utils.OracleClobTypeHandler}

Обратите внимание, что если обработчик типа является внутренним классом Utils, вместо этого на него нужно ссылаться как на example.Utils$OracleClobTypeHandler.

person ave    schedule 30.05.2019