限制映射以获得基于JPA的排序的特定一对一关系

时间:2017-11-21 13:47:52

标签: java hibernate jpa

情况

我有两个Hibernate实体,DocumentTitleTranslation,具有一对多关系,因为文档有多个标题,每种语言一个标题。 Document通过id有一个属性TitleTranslationdocument_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;

1 个答案:

答案 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");