Как использовать @OneToOne с @Where в Hibernate? - PullRequest
0 голосов
/ 27 июня 2018

У меня сейчас 2 объекта, один из них POST, а другой - POST_DETAIL. POST_DETAIL one хранит другой перевод POST.

(упрощенно) POST схема:

- ID NUMBER

(упрощенно) POST_DETAIL схема:

 - ID NUMBER
 - REF_ID NUMBER  # FK to POST.ID
 - LANG VARCHAR
 - TITLE VARCHAR

Я хотел бы иметь ТОЛЬКО один из (скажем, английского) POST_DETAIL внутри POST с аннотацией Hibernate

class Post {
    ...
    // annotations
    private PostDetail postDetailEn;
}

Любая помощь приветствуется

EDIT: Я надеюсь сделать что-то вроде

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;
}

но sql, зарегистрированный hibernate, ничего не показал для предложения 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))

Ответы [ 3 ]

0 голосов
/ 27 июня 2018

Для этого вы должны использовать аннотацию @OneToOne.

Сторона владельца

 class Post {
       @OneToOne(cascade = CascadeType.ALL)
       @JoinColumn(name = "postdetail_id")
       private PostDetail postDetail;
    }
0 голосов
/ 29 июня 2018

Я нашел этот пост о @ JoinFormula , и у меня похожая ситуация.

Поскольку мне нужно только PostDetail внутри Post, я не добавил поле Post в PostDetail, мое рабочее решение -

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;
}
0 голосов
/ 27 июня 2018
class Post {
    @OneToOne
    @JoinColumn(name = "ID", referencedColumnName = "REF_ID")
    private PostDetail postDetailEn;
}
...