为具有多个关系的表创建 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
(仅创建别名)作为列表。
希望对您有所帮助。
我有一个类似这样的 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
(仅创建别名)作为列表。
希望对您有所帮助。