Java 休眠具有多个条件的联接表,但@WhereJoinTable不起作用
有两个表A和B: A(id、b_id、A_其他) B(id,B_其他) A和B的相应类别如下所示:Java 休眠具有多个条件的联接表,但@WhereJoinTable不起作用,java,mysql,hibernate,join,Java,Mysql,Hibernate,Join,有两个表A和B: A(id、b_id、A_其他) B(id,B_其他) A和B的相应类别如下所示: @Entity @Table(name = "A") public class A { @Id @Column(name = "id") private Integer id; @JoinColumn(name = "b_id", nullable = true) @OneToOne(fetch = FetchType.EAGER) @WhereJ
@Entity
@Table(name = "A")
public class A {
@Id
@Column(name = "id")
private Integer id;
@JoinColumn(name = "b_id", nullable = true)
@OneToOne(fetch = FetchType.EAGER)
@WhereJoinTable(clause = "b_id > 0")
private B b;
@Column(name = "a_other")
private Integer aOther;
}
public class B {
@Id
@Column(name = "id")
private Integer id;
@Column(name = "b_other")
private Integer bOther;
}
我想要的查询如下所示:
从A.B_id=B.id和A.B_id!上的左连接B中选择*0
您可能会发现的痛点是额外的连接条件A.b_id!=0
我将@WhereJoinTable(clause=“b_id>0”)
附加到A类中,但它没有任何意义,因为我发现它根本不起作用
我将@WhereJoinTable
更改为@Where
,我没有发现任何更改,有人能帮我找出缺少的内容吗
提前谢谢。如果您想要一个b\U id!=0,您可以添加以下批注
@Where(clause = 'b_id > 0')
因此,您的代码应该如下所示:
@Entity
@Table(name = "A")
public class A {
@Id
@Column(name = "id")
private Integer id;
希望这对您有所帮助。您所说的工作原理是
select*from A left join B on A.B_id=B.id其中A.B_id!=0
,当A.b_id=0
时,我将一无所获,我想要的是从A.b_id=b.id和A.b_id!上的左连接b中选择*0
,当A.B_id=0
时,我将得到一个带有null B和notnull aOthers的对象A,这是不同的。但是,`Where(子句='B_id>0')`上面的字段不起作用,我在hibernate SQL日志中没有发现任何效果。您能否分享一个随机示例,就好像您得到的一样。。。。这应该行得通。你在@JoinColumn语句之后试过吗?我试过两个例子,下面是其中的一个日志:选择a0.id作为id1\u 0\u,a0.a\u其他作为a\u其他2\u 0\u,a0.b\u id作为b\u id3\u 0\u,b1\u.id作为id1\u,b1\u.b\u其他作为b\u其他2\u 1\u 1\u从a0\u左侧外部连接到b\u id=b\u,其中,@Where子句无效。您是否在@JoinColumn之后写Where
@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "b_id", nullable = true)
@Where(clause = 'b_id > 0')
private Audience audience;
@Id
@Column(name = "a_other")
private Integer aOther;
}
public class B {
@Id
@Column(name = "id")
private Integer id;
@Id
@Column(name = "b_other")
private Integer bOther;
}