Хранилище данных Java App Engine:Как запросить поля унаследованных классов объекта?

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

Вопрос

AppEngine 1.2.2.Я определяю класс Product следующим образом:

@PersistenceCapable(identityType = IdentityType.APPLICATION, table="Products")
public class Product {

 public Product(String title) {
  super();
  this.title = title;
 }

 public String getTitle() {
  return title;
 }

 @Persistent
 String title;

 @PrimaryKey
 @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
 private Key id;
}

Я определяю производный класс Book следующим образом:

@PersistenceCapable(identityType = IdentityType.APPLICATION, table="Products")
public class Book extends Product {

 public Book(String author, String title) {
  super(title);
  this.author = author;
 }

 public String getAuthor() {
  return author;
 }

 @Persistent
 String author;
}

Затем я создаю новый объект следующим образом:

PersistenceManager pm = PMF.get().getPersistenceManager();pm.makePersistent(new Book("Джордж Оруэлл", "1984"));

Я могу запросить этот новый объект, используя такой запрос:

Запрос запроса = pm.newQuery("выберите из " + Book.class.getName() + " где автор == параметр");query.declareParameters("Строковый параметр");Список результатов = (Список) query.execute("Джордж Оруэлл");

Это возвращает объект, потому что я запрашиваю поле «автор», определенное в книге.

Однако это не работает:

Запрос запроса = pm.newQuery("выберите из " + Book.class.getName() + " где заголовок == параметр");query.declareParameters("Строковый параметр");Список результатов = (Список) query.execute("1984");

Он выдает исключение, которое указывает, что поле «заголовок» отсутствует, даже несмотря на то, что оно определено в производном классе Product.

javax.jdo.JDOUserException: Field "title" does not exist in com.example.Book or is not persistent
NestedThrowables:
org.datanucleus.store.exceptions.NoSuchPersistentFieldException: Field "title" does not exist in com.example.Book or is not persistent

Кажется, что поля из унаследованных классов недоступны в запросах к хранилищу данных.

Возможно ли это на самом деле с изменением синтаксиса или с помощью аннотаций?

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

Решение

от: http://code.google.com/appengine/docs/java/datastore/usingjdo.html

Неподдерживаемые функции JDO

Следующие функции интерфейса JDO не поддерживаются реализацией App Engine:

Бесхозные отношения.Вы можете реализовать бесхозные отношения, используя явные значения Key.Синтаксис JDO для отношений без владельца может поддерживаться в будущих выпусках.Владение отношениями «многие ко многим».

«Присоединиться» к запросам.Вы не можете использовать поле дочерней сущности в фильтре при выполнении запроса к родительскому типу.Обратите внимание, что вы можете проверить поле родительской связи непосредственно в запросе, используя ключ.

Группировка JDOQL и другие агрегатные запросы.

Полиморфные запросы.Вы не можете выполнить запрос класса, чтобы получить экземпляры подкласса.Каждый класс представлен в хранилище данных отдельным типом сущности.

IdentityType.DATASTORE для аннотации @PersistenceCapable.Поддерживается только IdentityType.APPLICATION.

В настоящее время существует ошибка, препятствующая сохранению постоянных полей суперклассов в хранилище данных.Это будет исправлено в будущем выпуске.

Другие советы

Этот запрос, использующий DataNucleus с любым другим поддерживаемым нами хранилищем данных (например, СУБД, XML, Excel и т. д.), действительно должен разрешать поля в суперклассах;запрос действителен JDOQL.Если они не работают в GAE/J, сообщите об этой проблеме в системе отслеживания ошибок Google, хотя там, безусловно, уже есть проблема с наследованием.http://code.google.com/p/datanucleus-appengine/issues/list

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