Указание обработчика типа для аннотированной вставки MyBatis - PullRequest
0 голосов
/ 15 мая 2019

Я пытаюсь создать аннотированный оператор вставки, используя MyBatis, где в аннотации указан обработчик типа.

Например, в запросе выбора мы можем указать обработчик типа следующим образом:

@Results({
        @Result(column = "strings", property = "strings", typeHandler = StringArrayTypeHandler.class)
})
@Select("SELECT * FROM ${name} ORDER BY id ASC;")
List<StringObject> getStringObjects(@Param("name") String name);

Однако то же самое не представляется возможным для запроса вставки, так как аннотация @Results предназначена только для запросов @Select.

В настоящее время моя работа заключается в том, чтобы указать обработчик типа как частьстрока запроса, подобная этой:

@Options(useGeneratedKeys = true)
@Insert({"INSERT INTO ${name} (text, value, strings) VALUES (#{obj.text}, #{obj.value}, #{obj.strings, typeHandler=com.mypackage.typehandler.StringArrayTypeHandler});"})
void insertStringObject(@Param("obj") SenticConcept concept, @Param("name") String version);

Мой вопрос: можем ли мы указать класс обработчика типа в аннотации, а не быть частью строки запроса?

1 Ответ

0 голосов
/ 15 мая 2019

Это не может быть сделано.

При отображении результатов используются имена столбцов и ключи, поскольку значения столбцов в наборе результатов можно идентифицировать с помощью имени столбца, то есть mybatis может получить значение некоторого столбца по его имени. Таким образом, он может использовать конфигурацию сопоставления (например, typeHandler) для обработки значения в этом столбце.

Входные параметры для запроса в JDBC идентифицируются только по индексу параметра. В принципе, можно реализовать аннотацию, которая будет указывать typeHandler на основе индекса параметра, но это подвержено ошибкам, поскольку изменение в запросе может привести к изменению индексов параметров (возможно, по этой причине не сделано в mybatis).

...