为了账号安全,请及时绑定邮箱和手机立即绑定

Hibernate @OneToOne self join with OR in join 子句

Hibernate @OneToOne self join with OR in join 子句

绝地无双 2023-05-10 13:13:06
我有一个@OneToOne注释,我想加入 2 个可能的列。我知道如何使用普通 SQL 查询来完成它,但我不知道这如何与休眠注释一起使用。以下实体:@Entitypublic class Foo {    @Id    @GeneratedValue(strategy = GenerationType.IDENTITY)    private int id;    @OneToOne    @JoinColumn(name = "cancelRecord")    private Foo cancelRecord;    private String externalId;    private String externalCancellationId;}以及相应的数据库表:create table Foo(    id int identity(1,1) not null primary key, --primary key    cancelRecord int,    externalId varchar(100),    externalCancellationId varchar(100))到目前为止cancelRecord只加入了那个专栏。现在我希望它加入cancelRecordor externalCancellationId。一个有效的 SQL 查询是:SELECT f.* FROM Foo f         INNER JOIN Foo fo         ON (f.cancelRecord = fo.id         OR f.externalCancellationId = fo.externalId)这个查询的关键部分是OR在连接子句中(f.cancelRecord = fo.id **OR** f.externalCancellationId = fo.externalId)。我认为这是不可能的,我需要以某种方式@JoinColumn依赖。@JoinFormula这个假设对吗?如果是这样,我是否只需要将上面的查询复制为@JoinFormula?我试着用这个@JoinFoluma:@OneToOne@JoinFormula(value = "SELECT f.*         FROM Foo f         INNER JOIN Foo fo         ON (f.cancelRecord = fo.id         OR f.externalCancellationId = fo.externalId)")private Foo cancelRecord;
查看完整描述

2 回答

?
杨__羊羊

TA贡献1943条经验 获得超7个赞

这将不起作用,因为@JoinColumn@JoinFormula用于确定外键列值,因此它们不适用于多列。

如果定义多个@JoinColumnor @JoinFormula,则 ON 关系将使用 an ANDnot an OR

在你的情况下,因为你可能只想读取这个关联,而不是使用 Hibernate 设置它,那么你最好改用 SQL 查询。


查看完整回答
反对 回复 2023-05-10
?
森林海

TA贡献2011条经验 获得超2个赞

您可以使用多个@JoinColumn注解。请参见下面的示例:


   @OneToOne

   @JoinColumns(

     {

       @JoinColumn(updatable=false,insertable=false, name="cancelRecord", referencedColumnName="cancelRecord"),

       @JoinColumn(updatable=false,insertable=false, name="other", referencedColumnName="other")

     }

   )

   private Foo cancelRecord;


查看完整回答
反对 回复 2023-05-10
  • 2 回答
  • 0 关注
  • 133 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信