Hibernate Criteria join 查询一对多

标签 hibernate hibernate-criteria

我有一个 Cat 类和一个 Owner 类。一只猫有一个主人,但一个主人可以养多只猫。我要查询的是获取所有拥有蓝眼睛猫的主人 .

class Cat {
    Owner owner; //referenced from Owner.id
    String eyeColor;
}

class Owner {
    List<Cat> catList;
}

我尝试了一些代码,但我真的不知道该怎么做。
Criteria criteria = getCurrentSession().createCriteria(cat.getClass(), "cat");
criteria.createAlias("cat.owner", "owner");    
criteria.add(Restrictions.eq("cat.eyeColor", "blue");

最佳答案

Criteria 只能选择投影或根实体。不是一些加入的实体。因此,某些查询无法用 Criteria 表达(除了更好的可读性和简洁性之外,这是使用 HQL 的另一个很好的理由)。

但是,这里并没有丢失所有内容,因为您的关联是双向的。所以你只需要相当于 HQL 查询

select distinct owner from Owner owner 
join owner.cats cat 
where cat.eyeColor = 'blue'

这是
Criteria c = session.createCriteria(Owner.class, "owner");
c.createAlias("owner.cats", "cat");
c.add(Restrictions.eq("cat.eyeColor", "blue");
c.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);

关于Hibernate Criteria join 查询一对多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17701147/

相关文章:

grails - 在Grails中创建条件

hibernate - 如何解决 "Unable to resolve attribute [organizationType.id] against path"异常?

spring - 使用H2数据库创建表

java - 为什么 Hibernate 内联传递给 JPA Criteria Query 的 Integer 参数列表?

java - 使用按小时分组的 Hibernate 标准

java - hibernate 标准中的案例声明

java - 如何取消引用使用 intelliJ-IDE 构建的 Spring MVC 应用程序的旧 Wildfly 9.0.1 部署 Artifact ?

java - 当键在父类中时如何将一对多集合映射到连接的子类

hibernate - JPA 一对一映射

hibernate - 是否可以在 Projections、Criteria、Grails 中使用聚合函数和属性?