如何在 Hibernate 中使用 @OneToOne 和 @Where?
How to use @OneToOne with a @Where in Hibernate?
我现在有2个实体,一个是POST
,另一个是POST_DETAIL
。 POST_DETAIL
存储了 POST
.
的不同翻译
(简化)POST
模式:
- ID NUMBER
(简化)POST_DETAIL
架构:
- ID NUMBER
- REF_ID NUMBER # FK to POST.ID
- LANG VARCHAR
- TITLE VARCHAR
我想要 ONLY 其中之一(说英语)POST_DETAIL
在 POST
中使用 Hibernate 注释
class Post {
...
// annotations
private PostDetail postDetailEn;
}
感谢任何帮助
编辑:
我希望做类似
的事情
class Post {
...
@OneToOne(mappedBy = "post")
@JoinColumn(name = "ID", referencedColumnName = "REF_ID",
insertable = false, updatable = false)
@Where(clause = "POST_DETAIL.LANG = 'EN'") // not working
@WhereJoinTable(clause = "POST_DETAIL.LANG = 'EN'") // not working
private PostDetail postDetailEn;
}
class PostDetail {
...
@OneToOne
@JoinColumn(name = "REF_ID", insertable = false, updatable = false)
@Where(clause = "LANG = 'EN'") // not working
@WhereJoinTable(clause = "LANG = 'EN'") // not working
private Post post;
@Column(name = "REF_ID")
private Long refId;
@Column(name = "LANG")
private String lang;
}
但是 hibernate 记录的 sql 没有显示 where 子句的任何内容
编辑:例如:
数据库中的记录
+-----------+ +-----------------+ +-----------------+
| Post (#1) | | PostDetail (#1) | | PostDetail (#2) |
+-----------+ | refId: 1 | | refId: 1 |
| lang : EN | | lang : EN |
+-----------------+ +-----------------+
我想得到
Post(id=1,
postDetail=PostDetail(id=1,
refId=1,
lang=EN))
class Post {
@OneToOne
@JoinColumn(name = "ID", referencedColumnName = "REF_ID")
private PostDetail postDetailEn;
}
你应该为此使用@OneToOne 注释。
业主方
class Post {
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "postdetail_id")
private PostDetail postDetail;
}
我发现这个 post 关于 @JoinFormula 我也有类似的情况。
因为我只需要PostDetail
里面的Post
,所以我没有在PostDetail
中添加Post
字段,我的解决方案是
class Post {
...
@ManyToOne(fetchType = FetchType.LAZY)
@JoinFormula("(SELECT D.ID FROM POST_DETAIL D WHERE D.REF_ID = ID AND D.LANG = 'EN')")
private PostDetail postDetailEn;
}
我现在有2个实体,一个是POST
,另一个是POST_DETAIL
。 POST_DETAIL
存储了 POST
.
(简化)POST
模式:
- ID NUMBER
(简化)POST_DETAIL
架构:
- ID NUMBER
- REF_ID NUMBER # FK to POST.ID
- LANG VARCHAR
- TITLE VARCHAR
我想要 ONLY 其中之一(说英语)POST_DETAIL
在 POST
中使用 Hibernate 注释
class Post {
...
// annotations
private PostDetail postDetailEn;
}
感谢任何帮助
编辑: 我希望做类似
的事情class Post {
...
@OneToOne(mappedBy = "post")
@JoinColumn(name = "ID", referencedColumnName = "REF_ID",
insertable = false, updatable = false)
@Where(clause = "POST_DETAIL.LANG = 'EN'") // not working
@WhereJoinTable(clause = "POST_DETAIL.LANG = 'EN'") // not working
private PostDetail postDetailEn;
}
class PostDetail {
...
@OneToOne
@JoinColumn(name = "REF_ID", insertable = false, updatable = false)
@Where(clause = "LANG = 'EN'") // not working
@WhereJoinTable(clause = "LANG = 'EN'") // not working
private Post post;
@Column(name = "REF_ID")
private Long refId;
@Column(name = "LANG")
private String lang;
}
但是 hibernate 记录的 sql 没有显示 where 子句的任何内容
编辑:例如: 数据库中的记录
+-----------+ +-----------------+ +-----------------+
| Post (#1) | | PostDetail (#1) | | PostDetail (#2) |
+-----------+ | refId: 1 | | refId: 1 |
| lang : EN | | lang : EN |
+-----------------+ +-----------------+
我想得到
Post(id=1,
postDetail=PostDetail(id=1,
refId=1,
lang=EN))
class Post {
@OneToOne
@JoinColumn(name = "ID", referencedColumnName = "REF_ID")
private PostDetail postDetailEn;
}
你应该为此使用@OneToOne 注释。
业主方
class Post {
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "postdetail_id")
private PostDetail postDetail;
}
我发现这个 post 关于 @JoinFormula 我也有类似的情况。
因为我只需要PostDetail
里面的Post
,所以我没有在PostDetail
中添加Post
字段,我的解决方案是
class Post {
...
@ManyToOne(fetchType = FetchType.LAZY)
@JoinFormula("(SELECT D.ID FROM POST_DETAIL D WHERE D.REF_ID = ID AND D.LANG = 'EN')")
private PostDetail postDetailEn;
}