为具有多个关系的表创建 Hibernate 条件查询

Creating Hibernate Criteria Query for Tables with Multiple Relations

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

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;

}

现在,我想查询所有 class A 条目,其中 C.someField 等于传递的参数。

注:A和C没有直接关系

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

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

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

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'

所有 class 条目,其中 C.someField 等于传递的参数,例如 '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();

我已经更改了整个实现流程以及数据库结构,但是如果有人想实现类似的查询,可以按如下方式完成:

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(Criteria 之上的 Criteia),而是使用 criteria.crateAlias(仅创建别名)作为列表。

希望对您有所帮助。