Проблема с хранилищем данных Google с запросом типа *Пользователь*

StackOverflow https://stackoverflow.com/questions/933023

Вопрос

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

У кого-нибудь есть идеи?

Это было полезно?

Решение

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top