Mybathis 3 set null params as empty string

265
05 мая 2017, 16:27

Настраиваю Mybathis 3 в связке с PostgreSQL при попытке совершить insert в базу обнаружилась неприятная особенность: вместо null в запросе были сформированы пустые строки - ' ', из-за чего собственно запрос валится.

### The error may involve process_message.insert-Inline
### The error occurred while setting parameters
### SQL:
insert into UTP_PROCESS_MESSAGE (
       SYSTEM_ID,
       PROCESS_MESSAGE_DATA,
       PROCESS_ID,
       OPERATION_TYPE_ID
     ) VALUES **(
       ,
       ,
       ,
     )**
### Cause: org.postgresql.util.PSQLException: ERROR: syntax error at or near ","
  Позиция: 167 

Я ожидал, что запрос будет сформирован иначе:

insert into UTP_PROCESS_MESSAGE (
       SYSTEM_ID,
       PROCESS_MESSAGE_DATA,
       PROCESS_ID,
       OPERATION_TYPE_ID
     ) VALUES **(
       null,
       null,
       null,
       null
     )**

Если передать конкретные значения, то все работает верно.

Параметры задаю так:

HashMap <String, Long> params  = new HashMap<String, Long>();
            params.put("systemId", null);
            params.put("messageData", null);
            params.put("processId", null);
            params.put("operationTypeId", null);
            session.insert("process_message.insert", params);

SQL запрос выглядит так:

<insert id="insert" parameterType="Map">
    insert into UTP_PROCESS_MESSAGE (
      SYSTEM_ID,
      PROCESS_MESSAGE_DATA,
      PROCESS_ID,
      OPERATION_TYPE_ID
    ) VALUES (
      ${systemId,javaType=Long,jdbcType=BIGINT},
      ${messageData,javaType=String,jdbcType=VARCHAR},
      ${processId,javaType=Long,jdbcType=BIGINT},
      ${operationTypeId,javaType=Long,jdbcType=BIGINT}
     )
</insert>

Исчерпал уже все предположения. В чем может быть дело?

Answer 1

Ну вот, стоило только опубликовать вопрос, как я сам заметил в чем дело... Надеюсь, это поможет другим. Проблема в невнимательности: символ $ нужно заменить на #, вот так:

<insert id="insert" parameterType="Map">
    insert into UTP_PROCESS_MESSAGE (
      SYSTEM_ID,
      PROCESS_MESSAGE_DATA,
      PROCESS_ID,
      OPERATION_TYPE_ID
    ) VALUES (
      #{systemId,javaType=Long,jdbcType=BIGINT},
      #{messageData,javaType=String,jdbcType=VARCHAR},
      #{processId,javaType=Long,jdbcType=BIGINT},
      #{operationTypeId,javaType=Long,jdbcType=BIGINT}
     )
</insert> 
READ ALSO
Как через библиотеку gson взять 3 элемент?

Как через библиотеку gson взять 3 элемент?

// --- String input = text; JsonParser parser = new JsonParser(); JsonObject mainObject = parserparse(input)

364
Небольшое регулярное выражение для pattern html

Небольшое регулярное выражение для pattern html

У меня есть выражение: [А-Яа-яЁё\s]+$ Оно разрешает ввод любых кириллических букв и пробеловНужно к этому добавить ещё разрешение символов,...

253
Как получить все данные с HTML в Java? [требует правки]

Как получить все данные с HTML в Java? [требует правки]

Как распарсить все данные со страницы html в Java, а не определенные блоки? Хочу получить все данные со страницыМожет даже собрать их в БД

246