【问题标题】: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(仅创建别名)作为列表。
希望对您有所帮助。