我有两个Hibernate实体,Document
和TitleTranslation
,具有一对多关系,因为文档有多个标题,每种语言一个标题。
Document
通过id
有一个属性TitleTranslation
和document_id
引用。
因此,要将标题连接到文档,自然解决方案将是如下字段:
@JoinColumn(name = "document_id")
List<TitleTranslation> translations;
为了排序,我正在将Sort
对象传递给JPA存储库,例如repository.findAll(mySort)
。
排序顺序属性可以引用传递属性,例如owner.firstname
(文档具有所有者,所有者具有名字)。
只要传递属性以一对一的方式连接,这种方法就可以正常工作,但如上所述,它可以分解为一对多关系: 我想按文档的标题排序,但只有一个翻译列表。 但是,由于我只对一种特定语言感兴趣,因此列表中只有一个与我相关的标题,因此是一种事实上的一对一关系。
如何实现与某种语言的翻译的一对一映射,以便我可以按照例如translationEn.title
吗
事实证明,通过OneToOne
进行映射会导致其中一个翻译被挑选(第一个?):
@OneToOne(mappedBy = "document")
TitleTranslation translation;
这取决于TitleTranslation
:
@JoinColumn(name = "document_id", referencedColumnName = "id")
Document document;
现在,我想在translation
属性上指出只应加入language='en'
的翻译。
我尝试使用Where
注释,但这仅适用于一对多关系。
因此,以下内容无法按预期工作:
@OneToOne(mappedBy = "document")
@Where(clause = "language='en'")
TitleTranslation translation;
答案 0 :(得分:1)
您可以尝试使用过滤器:
1)定义过滤器:
@FilterDef(name = "enFilter"
, defaultCondition=" language='en'")
public class TitleTranslation {
2)使用过滤器:
@ManyToOne(mappedBy = "document")
@Filter(name = "enFilter")
TitleTranslation translation;
您可能需要定义@ManyToOne
而不是@OneToOne
。
3)在交易方法中:
Session session = sessionFactory.getCurrentSession();
session.enableFilter("enFilter");