Java App Engine数据存储:如何查询对象的继承类的字段?

时间:2009-08-11 16:35:08

标签: java google-app-engine jdo google-cloud-datastore

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(新书(“George Orwell”,“1984”));

我可以使用如下查询来查询这个新对象:

查询查询= pm.newQuery(“select from”+ Book.class.getName()+“where author == param”);  query.declareParameters(“String param”);  列表结果=(列表)query.execute(“George Orwell”);

这将返回对象,因为我正在查询Book上定义的字段“author”。

然而,这不起作用:

查询query = pm.newQuery(“select from”+ Book.class.getName()+“where 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 个答案:

答案 0 :(得分:3)

来自:http://code.google.com/appengine/docs/java/datastore/usingjdo.html

JDO不支持的功能

App Engine实现不支持JDO接口的以下功能:

无关的关系。您可以使用显式Key值实现无主关系。在将来的版本中可能支持JDO的无主关系语法。 拥有多对多的关系。

“加入”查询。在父类型上执行查询时,不能在过滤器中使用子实体的字段。请注意,您可以使用密钥直接在查询中测试父级关系字段。

JDOQL分组和其他聚合查询。

多态查询。您无法执行类的查询以获取子类的实例。每个类在数据存储区中由单独的实体类型表示。

用于@PersistenceCapable注释的IdentityType.DATASTORE。仅支持IdentityType.APPLICATION。

目前存在一个错误,可防止将超类上的持久字段保存到数据存储区。这将在以后的版本中修复。

答案 1 :(得分:1)

使用DataNucleus和我们支持的任何其他数据存储(例如RDBMS,XML,Excel等)的查询应该确实允许超类中的字段;查询是有效的JDOQL。如果他们不在GAE / J中工作,那么在Google的问题跟踪器中报告该问题,尽管肯定存在关于继承的问题 http://code.google.com/p/datanucleus-appengine/issues/list