请参阅以下关系:
Person {
long idPerson;
String name;
@OneToMany( mappedBy="owner", cascade=CascadeType.ALL, fetch=FetchType.EAGER )
List<Pet> pets;
}
@Inheritance( strategy=InheritanceType.JOINED )
Pet {
long idPet;
@ManyToOne
@JoinColumn( name="ID_PERSON", nullable=false )
Person owner;
String name;
}
Cat extends Pet { }
Dog extends Pet { }
Dragon extends Pet { }
这不是完整的代码,但你明白了......
正如您所看到的, InheritanceType 的策略是 JOINED 。所以如果我想要检索所有Person
的{{1}}例如,我的SQL就像:
Cat
如何使用Criterias进行操作?一个“解决方法”就是这样......:
SELECT * FROM PERSON, PET, CAT
WHERE PERSON.ID_PERSON=PET.ID_PERSON AND PET.ID_PET=CAT.ID_PET
如果我不需要应用某些限制,这对我来说会很好。
使用Criteria criteria = session.createCriteria( Cat.class ).list();
// then manually create a List<Person> and add all the Cat.owner to that list
不起作用,因为它会检索所有criteria.createAlias("Pet", "pet")
,无论它是否有Person
。
和Cat
甚至不会编译,因为criteria.createAlias("Cat", "cat")
没有Person
作为属性。
简而言之,我想要达到的目标相当于:
Cat
嗯,如果我使用 TABLE_PER_CLASS 策略,这可能会容易得多,但在我的真实项目中,JOINED就是最适合的那个......
如果可能的话,我想避免使用HQL来解决某些......“复杂”的原因..
提前致谢!
答案 0 :(得分:1)
试试这个,这就是你可以在继承中检查类的方法。
Criteria criteria = session.createCriteria( Person.class).createAlias("pets", "pet").add(Restrictions.eq("pet.class", Cat.class));