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
似乎数据存储区查询中没有来自继承类的字段。
这实际上可以通过语法或注释的变体来实现吗?
答案 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