【问题标题】:Creating Hibernate Criteria Query for Tables with Multiple Relations为具有多个关系的表创建 Hibernate 条件查询
【发布时间】:2020-03-04 19:10:32
【问题描述】:

我有一个类似这样的表结构...

class A{
    Integer id;

    @OneToMany //
    List<B> b;

}

Class B{

    Integer id;

    @ManyToOne
    A a;

    @OneToMany
    List<C> c;
}

Class C{

    Integer id;

    String someField;

    @ManyToOne
    B b;

}

现在,我要查询 C.someField 等于传递的参数的所有 A 类条目。

注意:A与C没有直接关系。

关系就像 A -> List 和 B -> List ,我需要在整个 C 列表中检查它。

如何为此类问题创建条件查询?

【问题讨论】:

    标签: java mysql hibernate spring-boot hibernate-criteria


    【解决方案1】:

    关于你的问题的查询是这样的,

    SELECT c1.name, c1.id
    FROM c c1
    JOIN b b1 on c1.b_id = b1.id
    JOIN a a1 on b1.a_id = a1.id
    WHERE a1.name = 'ABC'
    

    C.someField 等于传递的参数的所有 A 类条目,如 'ABC'

    解决方案:

    Criteria c_criteria = getCurrentSession().createCriteria(C.class,"c1"); 
    Criteria b_criteria = c_criteria.createCriteria("b","b1");
    Criteria a_criteria = b_criteria.createCriteria("c","c1");
    a_criteria.add(Restrictions.eq("name", "ABC"));
    
    ProjectionList properties = Projections.projectionList();
    properties.add(Projections.property("someField"));
    properties.add(Projections.property("id"));
    
    c_criteria.setProjection(properties);
    c_criteria.list();
    

    【讨论】:

    • 给我你的查询表,我会试着为它制定一个标准。
    【解决方案2】:

    我已经改变了我的整个实现流程以及数据库结构,但是如果有人想要实现类似的查询,可以这样做:

    Criteria criteria = getCurrentSession().createCriteria(A.class,"a");
    criteria.createCriteria("a.b",b);
    criteria.createCriteria("b.c",c);
    criteria.add(Restrictions.eq("c.someField","queryParameter");
    

    我之前所做的不是criteria.createCriteria(标准之上的Criteia),而是使用criteria.crateAlias(仅创建别名)作为列表。

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-08
      • 1970-01-01
      • 1970-01-01
      • 2012-12-01
      • 2021-05-28
      • 1970-01-01
      • 1970-01-01
      • 2016-08-09
      相关资源
      最近更新 更多