猿问

Hibernate @OneToOne self join with OR in join 子句

我有一个@OneToOne注释,我想加入 2 个可能的列。我知道如何使用普通 SQL 查询来完成它,但我不知道这如何与休眠注释一起使用。


以下实体:


@Entity

public 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;


绝地无双
浏览 134回答 2
2回答

杨__羊羊

这将不起作用,因为@JoinColumn或@JoinFormula用于确定外键列值,因此它们不适用于多列。如果定义多个@JoinColumnor @JoinFormula,则 ON 关系将使用 an ANDnot an OR。在你的情况下,因为你可能只想读取这个关联,而不是使用 Hibernate 设置它,那么你最好改用 SQL 查询。

森林海

您可以使用多个@JoinColumn注解。请参见下面的示例:   @OneToOne   @JoinColumns(     {       @JoinColumn(updatable=false,insertable=false, name="cancelRecord", referencedColumnName="cancelRecord"),       @JoinColumn(updatable=false,insertable=false, name="other", referencedColumnName="other")     }   )   private Foo cancelRecord;
随时随地看视频慕课网APP

相关分类

Java
我要回答