запрос хранилища данных appengine, выходящий за одинарную кавычку (') - PullRequest
0 голосов
/ 04 марта 2012

Я использовал javax.jdo.Query, как здесь JDO для Google App Engine: экранирование кавычек . Тем не менее, моя строка запроса с одинарной кавычкой (') продолжает взрываться.

Query query = pm.newQuery("select from " + Book.class.getName() + " where mArtist== '"+ artist + "' &&  mTitle=='" + title + "'");

Вот исключение

javax.jdo.JDOUserException: Portion of expression could not be parsed: 't Give Up' 
org.datanucleus.store.query.QueryCompilerSyntaxException: Portion of expression could not be parsed: 't Give Up'

Вот этот query.toString ()

SELECT FROM com.example.Book WHERE mArtist== 'Famous Writer' &&  mTitle=='We Won''t Give Up'

Да, я даже избежал одинарной кавычки (') с двойной одинарной кавычкой в ​​расчете на один документ

строковый литерал в виде строки в одинарных кавычках. Символы одинарных кавычек в строке должны быть экранированы как ''. Например: закусочная Джо 1016 *

Ответы [ 2 ]

2 голосов
/ 04 марта 2012

Построение запроса путем конкатенации строк почти всегда сопряжено с риском, даже если атаки с использованием SQL-инъекций невозможны.(Они не с GAE.)

См. http://code.google.com/appengine/docs/java/datastore/jdo/queries.html#Introducing_Queries и обратите внимание на бит "подстановки параметров".

1 голос
/ 04 марта 2012

Пример кода в документе охватывает только замену одного параметра. Вот немного больше.

Query query = pm.newQuery(Book.class);
query.setFilter("mArtist == artist && mTitle == title");
query.declareParameters("String artist,String title");              
List<Book> list = (List<Book>) query.execute("Famous Writer","We Won't Give Up");

Некоторые вопросы, которые стоит прочитать:

Как динамически создавать запросы JDO для нескольких параметров

Проблема Google Datastore с запросом на * Пользователь * тип

...