我有一个@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
用于确定外键列值,因此它们不适用于多列。
如果定义多个@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
提交
取消