Hibernate - 从连接表中获取数据

时间:2014-07-15 18:13:30

标签: java hibernate criteria

请参阅以下关系:

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来解决某些......“复杂”的原因..

提前致谢!

1 个答案:

答案 0 :(得分:1)

试试这个,这就是你可以在继承中检查类的方法。

Criteria criteria = session.createCriteria( Person.class).createAlias("pets", "pet").add(Restrictions.eq("pet.class", Cat.class));