当前位置: 首页 > 知识库问答 >
问题:

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

宗政海
2023-03-14

我有两个HiberNate实体,文档标题翻译,具有一对多的关系,因为一个文档有多个标题,每种语言一个。文档有一个属性id标题翻译通过document_id引用。

因此,要将标题连接到文档,自然的解决方案是如下字段:

@JoinColumn(name = "document_id")
List<TitleTranslation> translations;

对于排序,我目前将一个< code>Sort对象传递给JPA存储库,例如< code > repository . find all(my Sort)。排序顺序属性可以引用可传递属性,例如< code>owner.firstname(文档有所有者,所有者有firstname)。

只要传递属性以一对一的方式连接起来,这种方法就很有效,但会分解为一对多的关系,如上所述:我想按文档标题排序,但只有一个翻译列表。然而,由于我只对一种特定的语言感兴趣,列表中只有一个标题与我相关,因此实际上是一对一的关系。

如何实现某种语言翻译的一对一映射,以便我可以按< code>translationEn.title排序?

事实证明,通过<code>OneToOne</code>进行映射会导致选择其中一个翻译(第一个?):

@OneToOne(mappedBy = "document")
TitleTranslation translation;

这依赖于< code>TitleTranslation中的对应映射:

@JoinColumn(name = "document_id", referencedColumnName = "id")
Document document;

现在,我想在翻译属性上指出,只有语言='en'的翻译才应该连接。我尝试使用在哪里注解,但这仅适用于一对多关系。因此,以下操作没有按预期工作:

@OneToOne(mappedBy = "document")
@Where(clause = "language='en'")
TitleTranslation translation;

共有1个答案

宇文卓
2023-03-14

您可以尝试使用过滤器:

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");
 类似资料:
  • 主要内容:@OneToOne示例,程序输出结果一对一映射映射表示一个单值关联,其中一个实体的实例与另一个实体的实例相关联。在这种类型的关联中,源实体的一个实例可以映射到目标实体的一个实例。 完整的项目目录结构如下所示 - @OneToOne示例 在这个例子中,我们将创建一个学生和图书库之间的一对一关系,这样一个学生只能发放一种类型的图书。 这个例子包含以下步骤 - 第1步: 在包下创建一个实体类,在包下创建一个实体类,含学生ID()和学生姓名

  • 如果在中只有一组,这将非常好地工作。ASSESSMENT_COMMENT只有两列: 它将完美地代表一对多的关系。 现在问题来了: 那么,1)这是Hibernate中已知的bug吗?2)有办法解决这个问题吗?我可以强制Hibernate创建两个映射表,每个映射表一个吗?请记住,我不能更改类来引用(业务逻辑需求)

  • 将返回响应的控制器类的代码: 下面是具有一对一映射的两个实体类。 我得到的回应是: 如上面的响应所示,我只得到json值,我的意思是只得到没有列名的表值。因此,如何将json响应映射到响应协同响应键上。

  • 主要内容:@ManyToOne 示例,程序输出结果多对一映射表示实体集合可以与相似实体关联的单值关联。 因此,在关系数据库中,实体的多于一行可以引用另一个实体的相似行。 完整的项目目录结构如下所示 - @ManyToOne 示例 在这个例子中,我们将创建一个学生和图书库之间的多对一关系,多个学生可以发布同一本书。 这个例子包含以下步骤 - 第1步: 在包中创建一个实体类,包含学生ID(s_id)和学生姓名(s_name),其中包含一个包含库类型对

  • 主要内容:@OneToMany 示例,程序输出结果一对多映射进入集合值关联的类别,其中实体与其他实体的集合关联。 因此,在这种类型的关联中,一个实体的实例可以映射到另一个实体的任意数量的实例。 完整的项目目录结构如下所示 - @OneToMany 示例 在这个例子中,我们将创建一个学生和图书库之间的一对多系,这样一个学生能发放多种类型的图书。 这个例子包含以下步骤 - 第1步: 在包下创建一个实体类,它包含学生ID(s_id),学生姓名(s_na

  • 1. 前言 本节课程和大家一起聊聊关联映射。通过本节课程的学习,你将了解到: 什么是关联映射; 如何实现一对一关联映射。 2. 关联映射 关系数据库中的数据以表为家,一张表一个家,一个家住一类数据。众多表组成关系型社区,关系型社区群体中的数据关系通过主外键方式描述。 表与表之间的数据根据彼此的关系可分为: 一对一关系: 如老公表和老婆表的关系; 一对多关系: 如用户表和银行账号表关系; 多对一关系