Java Objectify 4.0中的实体层次结构

Java Objectify 4.0中的实体层次结构,java,google-app-engine,google-cloud-datastore,objectify,Java,Google App Engine,Google Cloud Datastore,Objectify,有没有一种方法可以定义一个实体层次结构,只允许查询特定的子类?考虑下面的情况。让我们有一个抽象基类来定义公共属性和具体的子类A和B class abstract Base { ... } class A extends Base { ... } class B extends Base { ... } 我想运行如下示例查询 检索A和B类型的所有实体 Base base = this.objectify.load().type(Base.class).list(); 检索类型A的所有

有没有一种方法可以定义一个实体层次结构,只允许查询特定的子类?考虑下面的情况。让我们有一个抽象基类来定义公共属性和具体的子类A和B

class abstract Base {
...
}

class A extends Base {
...
}

class B extends Base {
...
}
我想运行如下示例查询

  • 检索A和B类型的所有实体

     Base base = this.objectify.load().type(Base.class).list();
    
  • 检索类型A的所有实体

     Base base = this.objectify.load().type(A.class).list();
    
  • 检索类型B的所有实体

     Base base = this.objectify.load().type(B.class).list();
    
此外,我们希望将所有此类实体作为单一类型(基本实体)存储在GAE数据存储中

我们尝试使用此处描述的相关实体类的多态层次结构:


但这似乎无法处理有多个实体子类和一个公共父类的情况。

我不认为
Base
可以是抽象的,但这应该是可行的:

@Entity
class Base { ... }

@EntitySubclass(index=true)
class A extends Base { ... }

@EntitySubclass(index=true)
class B extends Base { ... }

如果希望能够按多态类型进行查询,则必须为要查询的类型编制索引。

谢谢您的回答。这正是我们所做的,但似乎不起作用。我们存储了ID为123456的对象B,然后运行查询-Base=this.objectify.load().type(A.class.ID)(“123456”)。因此,我们得到了具有指定ID的对象B,但是,我们希望什么也得不到,因为我们没有存储任何具有给定ID的类型a的对象。Load-by-ID为您提供具有指定ID的实体。它不是使用索引的查询;它只是通过键来获取-不管是什么东西,它都会被加载。是的,但是键由实体类型和ID组成,我认为使用…type(A.class).ID(“123456”)会将结果仅限于给定的类型。这可能与实体实际存储为基类型有关,对吗?对。就GAE(和Objectify)而言,您请求的是具有种类基和指定id的对象。它不是查询。我可以理解为什么这会让人困惑,但是Objectify显式加载对象,检查其类型,然后将其抛出似乎很愚蠢。不知道。最终我意识到它可能会像描述的那样工作(它实际上存储为基类型),但我想确保我没有遗漏什么。非常感谢。