我有一個@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只加入了那個專欄?,F在我希望它加入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
用于確定外鍵列值,因此它們不適用于多列。
如果定義多個@JoinColumn
or @JoinFormula
,則 ON 關系將使用 an AND
not an OR
。
在你的情況下,因為你可能只想讀取這個關聯,而不是使用 Hibernate 設置它,那么你最好改用 SQL 查詢。

森林海
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;
添加回答
舉報
0/150
提交
取消