Хранилище данных Java App Engine: Как запрашивать поля унаследованных классов объекта? - PullRequest
1 голос
/ 11 августа 2009

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 (новая книга («Джордж Оруэлл», «1984»));

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

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

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

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

Query query = pm.newQuery («выбрать из» + Book.class.getName () + «где title == param»); query.declareParameters ("String param"); Список результатов = (Список) query.execute ("1984");

Выдает исключение, в котором говорится, что нет поля 'title', даже если оно определено в производном классе 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

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

Возможно ли это на самом деле с изменением синтаксиса или с аннотациями?

Ответы [ 2 ]

3 голосов
/ 19 сентября 2009

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

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

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

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

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

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

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

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

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

1 голос
/ 11 августа 2009

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

...