我有以下情况,其中有两个类/表:

public class Parent {
    @Id
    @Column(name="parent_id")
    private Integer parentId;

    @ManyToOne
    @JoinColumn(name="child_id") //Notice here that i only specified one of the two id columns of the Child class
    private Child child;
    ...
}

public class Child {
    @Id
    @Column(name="child_id")
    private Integer childId;

    @Id
    @Column(name="alive")
    private Boolean alive;

    @Column(name="name")
    private String name;
}


如您所见,child具有两个主键,这意味着我可以在两行中具有相同的child_id,其中一个具有alive=true,另一个具有alive=false,但是我没有alive属性在父项上:

PARENT TABLE
parent_id | child_id
--------------------
500       | 1

CHILD TABLE
child_id | alive | name
--------------------------
1        | TRUE  | DONALD
1        | FALSE | HILLARY


我想让hibernate生成仅在alive时插入alive=true属性的join子句,例如:

select * from Parent inner join Child on Child.child_id=Parent.child_id and Child.alive=true


有没有办法做到这一点,所以当我执行类似select p from Parent p的查询时,它会按预期执行查询?

最佳答案

对于家长班,您可以使用

@JoinColumnOrFormula(formula=@JoinFormula(value="(SELECT a.id
                                                  FROM Child c
                                                  WHERE c.child_id=child_id
                                                  and alive=true)",
   referencedColumnName="child_id")


发表正确的评论作为答案

10-04 23:29