java - Hibernate - 从连接表中获取数据

标签 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其中有 Cat例如,我的 SQL 如下:

SELECT * FROM PERSON, PET, CAT
    WHERE PERSON.ID_PERSON=PET.ID_PERSON AND PET.ID_PET=CAT.ID_PET

如何使用 Criterias 来做到这一点?一个“解决方法”是这样的......:

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作为属性(property)。

简而言之,我想要达到的目标,相当于:

SELECT * FROM PERSON, PET, CAT
    WHERE PERSON.ID_PERSON=PET.ID_PERSON AND PET.ID_PET=CAT.ID_PET
        AND PERSON.something=...
        AND PET.something=...
        AND CAT.something=... ( and a lot more... )

好吧,如果我使用 TABLE_PER_CLASS 策略,这可能会容易得多,但在我的实际项目中,JOINED 是最适合的策略......

如果可能的话,出于某些“复杂”的原因,我想避免使用 HQL..

提前致谢!

最佳答案

试试这个,这是检查继承中的类的方法。

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

关于java - Hibernate - 从连接表中获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24765288/

相关文章:

JAVA和GIT如何管理外部资源。采取正确的技术

java - 实例同步

java - 删除数组中的元素,这些元素是 Java 中其他元素的子串

java - 在 JBOSS EAP 6.3 中从 RESTFul 客户端(两者位于同一安全域)调用 RESTFul Web 服务时出现 HTTP 错误 401

java - 如何在一个 JPQL 查询中使用多个 JOIN FETCH

java - 如何在 hibernate 中泛化模型类?

hibernate - Grails “stuck”始终记录所有SQL查询

grails - 将SQL查询转换为GORM条件

java - Hibernate 查询异常

java - Hibernate 标准,两个实体