Как%?% Не работает как часть SQL-запроса StringBuilder - PullRequest
2 голосов
/ 21 марта 2011

Иметь следующий строковый SQL-запрос:

    StringBuilder querySelect = new StringBuilder("select * from messages ");
    StringBuilder queryWhere = new StringBuilder("where msg_id=?");

        if (fileRSVO.getFileName()!= null){
            queryWhere.append("and descr LIKE %?% ");
        }
querySelect.append(queryWhere);

    List<Map<String, Object>> list = getJdbcTemplate().queryForList(querySelect.toString(), params.toArray()); 
    ...

Проблема в этой части:

queryWhere.append("and descr LIKE %?% ")

LIKE не работает.
Проверено в отладке - добавляется ко всем запросам.
Это должен быть одинарный кавычка или какой-то другой трюк?

спасибо.

EDITED

пробовал одинарные кавычки: queryWhere.append("and descr LIKE '%?%' ") не работает

вот строка отладки:

select * from messages where msg_id=? and descr LIKE '%?%' 

Ответы [ 8 ]

4 голосов
/ 21 марта 2011

Предполагая, что запрос выполняется с использованием PreparedStatement, проблема, вероятно, заключается в том, что queryForList вызывает setString(1, 'some descr'). Это разрешило бы SQL к "... and descr LIKE %'some descr'%".

Попробуйте изменить код на:

queryWhere.append("and descr LIKE ?");
...
.setString(1, "%some descr%")
3 голосов
/ 21 марта 2011

? не является местозаполнителем для текстовой подстановки, это параметр (т. Е. Он похож на переменную в Java), поэтому его следует рассматривать как отдельный токен.Это должно работать, но, возможно, не во всех базах данных:

queryWhere.append("and descr LIKE ('%' || ? || '%')"); 

В качестве альтернативы вы можете передавать % s как части значения параметра, как предложено Джастином Мюллером.

3 голосов
/ 21 марта 2011

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

queryWhere.append("and descr LIKE '%?%' ") 
2 голосов
/ 21 марта 2011

Я всегда беру параметр и помещаю % в параметр, а затем связываю его с and descr like ?.

2 голосов
/ 21 марта 2011

Вы хотели бы сделать

queryWhere.append("AND descr LIKE'%?%'");

Я завернул%?% В одинарные кавычки.

Чтобы увидеть больше примеров запросов LIKE, проверьте this .

0 голосов
/ 22 ноября 2018

Если вы используете стороннюю библиотеку для управления динамическим SQL , это вариант для вас, вот решение, которое использует jOOQ (отказ от ответственности: я работаю на поставщика)

ctx.selectFrom(MESSAGES)
   .where(MESSAGES.MSG_ID.eq(msgId))
   .and(fileRSVO.getFileName() != null
      ? MESSAGES.DESCR.contains(descr)
      : DSL.noCondition())
   .fetch();

Это использует метод Field.contains(T), который переводится в:

[ field ] like ('%' || escape(value, '\') || '%') escape '\'

Обратите внимание на использование escape(), что необходимо в случае, если ваша строка содержит символы подстановки,Конечно, можно было бы объединить подстановочные знаки, уже существующие в Java:

ctx.selectFrom(MESSAGES)
   .where(MESSAGES.MSG_ID.eq(msgId))
   .and(fileRSVO.getFileName() != null
      ? MESSAGES.DESCR.like("%" + descr + "%")
      : DSL.noCondition())
   .fetch();
0 голосов
/ 13 августа 2012

Используйте этот код:

StringBuilder querySelect = new StringBuilder("select * from messages ");
StringBuilder queryWhere = new StringBuilder("where msg_id=?");

if (fileRSVO.getFileName()!= null){
    queryWhere.append("and descr LIKE %?% ");
}
querySelect.append(queryWhere);

List<Map<String, Object>> list = getJdbcTemplate().queryForList(querySelect.toString(), params.toArray()); 
...
0 голосов
/ 21 марта 2011
StringBuilder querySelect = new StringBuilder("select * from messages");
StringBuilder queryWhere = new StringBuilder("where msg_id=?");
if (fileRSVO.getFileName()!= null){
  queryWhere.append("and descr LIKE %?% ");
}
// query = "select * from messageswhere msg_id=?and descr LIKE %?% "

Как видите, запрос недействителен. Вы должны добавить пробелы:

StringBuilder querySelect = new StringBuilder("select * from messages ");
StringBuilder queryWhere = new StringBuilder("where msg_id=? ");
if (fileRSVO.getFileName()!= null){
  queryWhere.append("and descr LIKE %?% ");
}
// query = "select * from messages where msg_id=? and descr LIKE %?% "

А про часть: descr LIKE%?%

Я не совсем уверен, как это передается через базу данных. Просто "как есть" или как второй параметр, который необходимо заполнить. Если "как есть", то? рассматривается как подстановочный знак, и все результаты принимаются. Если нет, 2-й? не заполнено (правильно). Попробуйте использовать:

descr LIKE ?

И добавьте% до и после значения в вашем Java-коде.

...