2009-05-31 2 views
1

На this вопрос, который я решил проблему запросов Google Datastore, чтобы получить материал пользователем (com.google.appengine.api.users.User), как это:Google Datastore проблема с запросом на * пользователя * типа

User user = userService.getCurrentUser(); 
String select_query = "select from " + Greeting.class.getName(); 
Query query = pm.newQuery(select_query); 
query.setFilter("author == paramAuthor"); 
query.declareParameters("java.lang.String paramAuthor"); 
greetings = (List<Greeting>) query.execute(user); 

Вышеописанное прекрасно работает, но после небольшого беспорядка я понял, что этот синтаксис не очень практичен, так как возникает потребность в создании более сложных запросов, поэтому я решил вручную создать свои фильтры, и теперь я получил, например, что-то вроде следующего (где фильтр обычно передается как строковая переменная, но теперь он встроен в линию для простоты):

User user = userService.getCurrentUser();  
String select_query = "select from " + Greeting.class.getName(); 
Query query = pm.newQuery(select_query); 
query.setFilter("author == '"+ user.getEmail() +"'"); 
greetings = (List<Greeting>) query.execute(); 

Очевидно, что это не сработает, даже если этот синтаксис с field = 'value' равен supported by JDOQL, и он отлично работает в других полях (типы строк и перечисления). Другая странная вещь заключается в том, что, глядя на средство просмотра данных в приборной панели приложения, поле «автор» сохраняется как тип User, но это значение «[email protected]», а затем снова, когда я устанавливаю его как параметр (в случае выше, который работает отлично) Я объявляю параметр как строку, затем передавая экземпляр пользователя (пользователя), который сериализуется с простым toString() (я думаю).

У вас есть идеи?

ответ

1

Использование замены строк в языках запросов всегда Плохая идея. Слишком легко для пользователя вырваться и запутаться в вашей среде, и он вводит целую коллекцию проблем с кодированием и т. Д.

Что случилось с вашим ранним подстановочным подходом? Насколько мне известно, он поддерживает все, и это оборачивает любые проблемы синтаксического анализа. Что касается проблемы с пониманием того, сколько аргументов нужно пройти, вы можете использовать Query.executeWithMap или Query.executeWithArray для выполнения запроса с неизвестным количеством аргументов.

+0

Привет, спасибо за ваш ответ - это показывает, в чем проблема с заменой параметров (задан другой вопрос, так как это немного другая проблема) – JohnIdol

+0

забыли ссылку -> http://stackoverflow.com/questions/935762/how- to-dynamic-build-jdo-queries-on-multiple-parameters – JohnIdol

+0

Обновлен мой ответ. –

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