Проблема Google Datastore с запросом по типу * User * - PullRequest
1 голос
/ 01 июня 2009

В этом вопросе. Я решил проблему запроса Google Datastore для получения материалов пользователем (com.google.appengine.api.users.User) следующим образом:

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' поддерживается JDOQL , и он отлично работает в других полях (строковые типы и перечисления). Другая странная вещь заключается в том, что при просмотре средства просмотра данных на панели инструментов движка приложения поле «автор» сохраняется как тип пользователь , но значение равно «user@gmail.com», а затем снова, когда я установите его как параметр (вышеописанный случай, который работает нормально) Я объявляю параметр как String, затем передаю экземпляр User (user), который сериализуется с простым toString() (я полагаю).

Кто-нибудь есть идеи?

1 Ответ

1 голос
/ 02 июня 2009

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

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

...