【发布时间】:2017-02-01 11:01:30
【问题描述】:
我有一个小项目,其中我有一个主表,它是表层次结构的根,这个表有一个“ID”和一个“实例 ID”,它们都代表一个主键。这是因为如果行中有任何更改,我想继续跟踪更改。此外,在这个根表中,我有一个属性可以将行标记为“已删除”。
我想要做的是以下查询:给定一个“ID”(第一个)请求,我想获取具有“已删除”属性的单行为 0(这意味着它是当前活动行,因为标记为 1 的行是存储在同一个表中的历史记录的一部分)以及层次结构的后续属性。
例如,如果我有一个名为 Animal 的表,它有一个名为 Dog 的子表,我想通过他的“ID”恢复整个 Dog 对象,这是 Animal 的外键。 Hibernate 有一个能够做到这一点的方法,但问题是如果我想使用它,我不能使用 Where 子句,如果我编写查询,我必须根据子对象类显式编写连接我想得到的。
// This is what I have
public Dog returnAnimalData(String ID) {
List<Dog> dogs = hibernate.getCurrentSession().get(Dog.class, ID);
for (Dog dog : dogs) {
if(dog.getMarkAsDeleted().equals(0)){
return dog;
}
}
return null;
}
// This is what I would like
public Dog returnAnimalData(String ID) {
@Where(clause="deleted=0")
Dog dog = hibernate.getCurrentSession().get(Dog.class, ID);
// Or
Dog dog = hibernate.getCurrentSession().get(Dog.class, ID, 'where deleted = 0');
return dog;
}
编辑:
一个例子:
Animal 有 ID、InstanceID、deletedFlag 和 typeOfAnimal Dog 有 ID、InstanceID 和 Name,Dog 扩展 Animal Cat 有 ID、InstanceID、Name 和 isFat,Cat 扩展了 Animal
流程是这样的:
Ask for animal 1
-> Animal 1 is a Dog
-> search Dog with ID=1 and deletedFlag=0
-> retrieve Dog (IDs, deletedFlag, animalType, Name)
Ask for animal 2
-> Animal 2 is a Cat
-> search Cat with ID=2 and deletedFlag=0
-> retrieve Cat (IDs, deletedFlag, animalType, Name, isFat)
问题是解决这个查询而不用担心 Animal 的子类的数量,比如“SELECT animal FROM CONCRETE_ANIMAL_TABLE where deletedFlag=0”,其中 CONCRETE_ANIMAL_TABLE 可以是表 Dog、Cat 等的名称。我我会先尝试做纳罗斯的答案。
如果我找到答案,我会发布它,因为我认为这是一个非常有趣的问题,也许它应该有助于理解如何使用 Hibernate 管理层次结构。
【问题讨论】:
标签: java sql oracle hibernate hierarchical-data