2016-03-09 3 views
1

Я пытаюсь написать этот запрос в MyBatisиндекс MyBatis параметров вне диапазона

(select * from table1 where field1 like '%"name":"appname"%' limit 1) 
    union all 
    (select * from table2 where field1 like '%"name":"appname"%' limit 1) 
    limit 1 

Так что я создал эту аннотацию:

@Select({ 
    "(select * from table1 where field1 like '%\"name\":\"#{name,jdbcType=VARCHAR}\"%' limit 1)", 
    "union all", 
    "(select * from table2 where field1 like '%\"name\":\"#{name,jdbcType=VARCHAR}\"%' limit 1)", 
    "limit 1" 
}) 
@Results({ 
    @Result(column="ID", property="id", jdbcType=JdbcType.INTEGER, id=true) 
}) 
Object hasName(@Param("name")String name); 

Но когда я запускаю его я получаю это исключение :

не удалось установить параметры для отображения: ParameterMapping {свойство = 'имя', режим = IN, javaType = класс java.lang.String, jdbcType = VARCHAR, numericScale = нуль, т esultMapId = 'null', jdbcTypeName = 'null', expression = 'null'}. Причина: org.apache.ibatis.type.TypeException: параметр ошибки, не равный нулю для параметра # 1, с JDBCType VARCHAR. Попробуйте установить другой JdbcType для этого параметра или другого свойства конфигурации. Причина: java.sql.SQLException: Индекс параметров вне диапазона (1> количество параметров, которое равно 0).

Могу ли я сопоставить аннотацию, или что-то не хватает? Я не хочу использовать XML для этого.

+0

Вы можете передать два параметра разные имена и проверки? 'hasName (@Param (" name ") Имя строки, @Param (" otherName ") String otherName);' Я думаю, проблема в том, что mybatis ожидает два параметра, но вы их передаете. – Lucky

+0

@ Lucky Я получаю ту же ошибку. Я думаю, что что-то не так с " – feco

+0

Можете ли вы также опубликовать эквивалент mysql этого запроса в своем вопросе и попробовать, если это работает в вашем workbench mysql? – Lucky

ответ

2

я решил изменить часть моего запроса от

field1 like '%\"name\":\"#{name,jdbcType=VARCHAR}\"%' 

в

field1 like #{name,jdbcType=VARCHAR} 

и имеют имя параметра изменилось в Java

parameter = "%\"name\":\"" + parameter + "\"%"; 

Я последовал объяснение от post Я нашел

'%'||${specific_string}||'%'

или

#{do_it_in_java}

или

someFunctionOrProc(#{specific_string}) где функция/Proc будет обрабатывать его. Если вы используете это много в нескольких SqlMaps, то я могу пойти по этой дороге.

+1

Я просто работал в этом запросе и с сообщением, с которым вы связались, мне также пришлось использовать условие LIKE в mysql и следовать первому методу, ''% '|| $ {param} ||'% '', но для выполнения запроса должно быть' '%' || # {param} || '%''.Символ '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' mybatis считает, что я извлекаю из класса 'String', Приветствует ответ. ;) – Lucky

1

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

-- AND (neId=#{neId})) 
+0

Это была моя проблема. В моем картографическом файле XML MyBatis я прокомментировал часть запроса в блоке '', используя стандартный блок комментариев '' * * * '' '' '' '' '' '' '' '' '' '. Удаление комментариев разрешило мою проблему. Спасибо @golimar –

Смежные вопросы