希望你能帮我。
表A与表B有一个多列联接,其中一个JoinColumns可以为空...
@Entity
@Table(name = "TABLE_A")
public class TableA {
@ManyToOne(fetch = FetchType.EAGER, optional = false)
@JoinColumns({
@JoinColumn(name = "KEY1_TABLE_A", referencedColumnName = "KEY1_TABLE_B"),
@JoinColumn(name = "KEY2_TABLE_A", referencedColumnName = "KEY2_TABLE_B"),
@JoinColumn(name = "GROUP_TABLE_A", referencedColumnName = "GROUP_TABLE_B", nullable = true)})
private TableB typeB;
}
在TableB中,
- TABLE_B#KEY1_TABLE_B(非空)
- TABLE_B#KEY2_TABLE_B(非空)
- TABLE_B#GROUP_TABLE_B(可空)
Map为字符串。组合KEY1_TABLE_B /KEY2_TABLE_B /GROUP_TABLE_B是唯一键。
生成的SQL如下所示(缩短)
SELECT
*
FROM
table_a this_
INNER JOIN table_b b_ ON
this_.KEY1_TABLE_A = b_.KEY1_TABLE_B AND
this_.KEY2_TABLE_A = b_.KEY2_TABLE_B AND
this_.GROUP_TABLE_A = b_.GROUP_TABLE_B <-- here is the issue: works only with "is not null" on Oracle
WHERE
this.XYZ=<some-conditions-here>;
如果我直接写SQL,它应该是这样的
on ... AND (
(this_.GROUP_TABLE_A = b_.GROUP_TABLE_B)
OR (this_.GROUP_TABLE_A is null and b_.GROUP_TABLE_B is null)
)
感谢您的意见和建议!
1条答案
按热度按时间jljoyd4f1#
看起来这场比赛应该有两个部分。
1.**@ManyToOne(...,optional = false)**表示该关系是强制性的,或者它是一个INNER JOIN。INNER JOIN需要在关系上进行直接比较。所以查询的输出形式是正确的。