Hibernate:在多个连接表上创建属性的映射

时间:2012-02-27 12:47:01

标签: java hibernate join

我在数据库中有三个表(名为A,B和C):

A
-----
ID
B_ID
-----
B
-----
ID
C_ID
-----
C
-----
ID
-----

我分别有A,B和C类。


public class A{
    private Long id;
    private Long b_id;
}

public class B{
    private Long id;
    private Long c_id;
}

public class C{
    private Long id;
}

从类“A”的代码中可以看出,我已经映射了类B的ID而不是对象,以下:


<property name="b_id" column="B_ID" type="java.lang.Long" not-null="false">

现在我需要为ID“C”执行此操作,即我可以直接使用

获取A的关联C对象的ID

a.getC_id();

我怎样才能做到这一点?这应该这样做,以便当Hibernate从数据库中读取A对象时,C的ID被连接到查询,即没有额外的查询或子查询(a.getB()。getC_id()是不可接受的)

2 个答案:

答案 0 :(得分:1)

首先创建一个DTO对象,

public class ADTO {
    private Long a_id;
    private Long b_id;
    private Long c_id;
    public ADTO(Long a_id,Long b_id,Long c_id){
       this.a_id = a_id;
       this.b_id = b_id;
       this.c_id = c_id;
    }
}

现在使用查询

select new com.foo.ADTO(a.id,b.id,c.id) from A a, B b, C c where a.id = b.a_id and b.id = c.b_id

您甚至可以使用课程A执行此操作,我已避免,因为我不确定AC之间的关系是否会发送到one to one或不。 DTO始终是安全的。

阅读API文档here或示例here,了解如何调整HQL选择。

答案 1 :(得分:1)

作为ManuPK答案的变体,您还可以将A的实例放入DTO。

public class AWithCID {
    public final A a;
    public final cID;
    public AWithCID(A a, Long cID) { this.a = a; this.cID = cID; }
}

select new AWithCID(a, b.cID) from A a, B b where a.bID = b.id