Java 如何在Hibernate中使用@OneToOne和@Where?
我现在有两个实体,一个是Java 如何在Hibernate中使用@OneToOne和@Where?,java,hibernate,one-to-one,Java,Hibernate,One To One,我现在有两个实体,一个是POST,另一个是POST\u DETAIL。POST\u DETAILone存储POST的不同翻译 (简化)POSTschema: - ID NUMBER - ID NUMBER - REF_ID NUMBER # FK to POST.ID - LANG VARCHAR - TITLE VARCHAR (简化)POST\u细节schema: - ID NUMBER - ID NUMBER - REF_ID NUMBER # FK to POST.
POST
,另一个是POST\u DETAIL
。POST\u DETAIL
one存储POST
的不同翻译
(简化)POST
schema:
- ID NUMBER
- ID NUMBER
- REF_ID NUMBER # FK to POST.ID
- LANG VARCHAR
- TITLE VARCHAR
(简化)POST\u细节
schema:
- ID NUMBER
- ID NUMBER
- REF_ID NUMBER # FK to POST.ID
- LANG VARCHAR
- TITLE VARCHAR
我想在POST
中找到唯一一个(比如英语)带有Hibernate注释的POST\u DETAIL
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))
对此,您应该使用@OneToOne注释 所有者方
class Post {
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "postdetail_id")
private PostDetail postDetail;
}
我发现这篇文章和我有类似的情况
由于我只需要postdail
内部的Post
,我没有在postdail
中添加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;
}
但一篇文章(针对不同的语言)将有多个帖子详细信息,如何指定where子句
lang='EN'
?我检查了hibernate日志,发现查询的where子句正在比较PostDetail
的ID
而不是REF\u ID
如何声明类PostDetail
中的REF\u ID
字段?@Column(name=“REF\u ID”)私有长refId;我只希望在帖子中有一个(例如lang='EN'
)PostDetail,而不是它们的列表。我怎样才能做到这一点?感谢您的帮助。您应该使用OneTONE和with JoinColumn注释而不是OneToMany。将有多个PostDetail
具有不同的lang
但相同的refId
到Post
。但是我只想在Post
中有一个(lang='EN'
)postdail
。我想我还需要指定一些where
子句?每个帖子可以使用OneToOne拥有一个postdetail,postdetail只能与单个帖子链接,不会与任何其他帖子关联。如果您想在其他人之间共享postdetail,那么可以使用manytone.Check@PrimaryKeyJoinColumn注释。使用此选项,Post表的PK将是POSTDEAIL表的PK,也将是FK到Post表。