Хранилище данных механизма приложения - запрашивает на полях Enum

Я использую GAE (Java) с JDO для персистентности.

У меня есть объект с полем Enum, которое отмечено как @Persistent и сохраняется правильно в хранилище данных (Как наблюдается от средства просмотра Хранилища данных в Консоли Разработки). Но когда я запрашиваю эти объекты, помещая фильтр на основе Перечисления значений, это всегда возвращает меня все объекты безотносительно значения, которое я указываю для перечислимого поля.

Я знаю, что Java GAE поддерживает перечисления, сохраняемые точно так же, как основные типы данных. Но это также позволяет получать/запрашивать на основе их? Поиск Google не мог указать на меня ни на какой подобный пример кода.

Подробнее:

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

SELECT FROM com.xxx.yyy.User WHERE role == super ORDER BY key desc RANGE 0,50

SELECT FROM com.xxx.yyy.User WHERE role == admin ORDER BY key desc RANGE 0,50

Оба выше запросов возвращают меня все Пользовательские объекты из хранилища данных несмотря на средство просмотра хранилища данных, показывающее, что некоторые Пользователи имеют тип 'администратор', и некоторые имеют тип 'супер'.

6
задан David Underhill 21 July 2010 в 20:55
поделиться

2 ответа

На данный момент я заменил Enums на простые целочисленные константы. Сообщил об этом случае как о проблеме в google app engine : http://code.google.com/p/googleappengine/issues/detail?id=2927

3
ответ дан 16 December 2019 в 21:38
поделиться

Для параметра, отличного от String или int, я считаю вместо этого вам нужно использовать declareParameters. Попробуйте что-то вроде этого:

Query q = pm.newQuery(com.xxx.yyy.User.class);
q.setFilter("role == p1");  //p1 is a variable place holder
q.declareParameters("Enum p1"); //here you define the data type for the variable, in this case an Enum
q.setRange(0, 50);
q.setOrdering("key desc");

AbstractQueryResult results = (AbstractQueryResult) pm.newQuery(q).execute(admin);

или, если вам нужен синтаксис, похожий на gql -

Query query = pm.newQuery("SELECT FROM com.xxx.yyy.User WHERE role == p1 ORDER BY key desc RANGE 0,50");
query.declareParameters("Enum p1");
AbstractQueryResult results = (AbstractQueryResult) pm.newQuery(q).execute(admin);
3
ответ дан 16 December 2019 в 21:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: