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表。