假设我有Hibernate实体类A,B,C。B是A和C的字段。现在,我想根据C的其他字段的条件检索A.我怎样才能做到这一点?
@Entity
@Table(name = "A")
@Proxy(lazy = false)
public class A {
...
@ManyToOne
@JoinColumn(name = "b_ID")
private B b;
...
}
@Entity
@Table(name = "C")
@Proxy(lazy = false)
public class C {
...
@ManyToOne(targetEntity=B)
@JoinColumn(name="b_ID")
private B b;
...
}
@Entity
@Table(name = "B")
@Proxy(lazy = false)
public class B {
...
}
现在我想获得A的列表,当C的记录满足某些条件时。提前谢谢。
答案 0 :(得分:0)
您可以执行以下操作:
SELECT a FROM A a JOIN a.b b WHERE b.c.att = :value
还有更多选择
我试图向您展示您可以使用JOIN
或使用任何属性的完整路径。例如:
SELECT a FROM A a WHERE a.b.c.att = :value
SELECT a FROM A a JOIN a.b b JOIN b.c c WHERE c.att = :value
但对于这些方法,必须具有双向关系 为此,请更新您的B类:
public class B {
@OneToMany( ... )
private List<C> cList;
}
如果没有这个,您可以通过以下方式获得相同的结果:
SELECT a FROM A a WHERE a.b in ( SELECT c.b FROM C c WHERE c.att = :value )
答案 1 :(得分:0)
您可以编写一个NATIVE SQL QUERY来实现此目的:
Query query = session.createSQLQuery("select * from A a INNER JOIN B b ON
a.b_ID = b.b_ID INNER JOIN C c ON b.b_ID = c.b_ID WHERE c.column = 123");
query.addEntity(A.class);
List<A> aList = query.list();
在上面提到的SQL查询中,您可以添加要在WHERE子句中过滤的表“C”字段。
答案 2 :(得分:0)
它是否等于您要查找的SELECT A.* FROM A join B join C where C.X=? GROUP BY A.id, A...
(完成加入&#39; ON&#39;语法)之类的查询?
如果是,那么这只是hibernate中的标准HQL或Criteria查询,只有在表B代码中有B到C的关系时才会这样:
@OneToMany(fetch = FetchType.LAZY, mappedBy = "tableB")
public List<TableC> getTableCs;
如果您不想添加该双向关系,那么只需使用本机SQL。
答案 3 :(得分:0)
当C满足某些条件时,您想要获取A的列表。我们也可以通过使用@OneToMany:
在C实体中进行映射来实现@Entity
@Table(name = "C")
@Proxy(lazy = false)
public class C {
...
@OneToMany( ... )
private List<A> aList;
}