Hibernate通过公共类字段连接两个类

时间:2017-10-09 03:03:12

标签: java hibernate

假设我有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的记录满足某些条件时。提前谢谢。

4 个答案:

答案 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;
}