使用具有一对多关系的 JPA 映射实体,如何添加连接条件

Posted

技术标签:

【中文标题】使用具有一对多关系的 JPA 映射实体,如何添加连接条件【英文标题】:With JPA Mapped Entities with one-to-many relationships, how can I add join criterias 【发布时间】:2018-11-20 05:22:04 【问题描述】:

鉴于情况:数据库是在 Hibernate 尚未诞生时创建的,我们在这里谈论真正的遗产。 我的表从未删除过记录,只需在行上设置一个 active 标志以将条目标记为当前正在使用。查询通常如下所示:

SELECT * from A left join B on A.id = B.a_id and B.active = 1

在Java中定义了实体A和B,并且A有一个属性

@OneToMany
private Set<B> b; 

如何注释属性以添加条件“and B.active=1”?

首选 JPA 解决方案,但如有必要,我们也可以使用休眠注释。

以类似的方式,我们遇到条目具有有效日期范围的情况,因此我们必须添加类似于

的条件
"and B.active_From >= now() and (B.active_to is null or B.active_to < now())"

【问题讨论】:

你在使用 Spring Framework 和 JPA 吗? Hibernate 特定的解决方案是这里唯一的选择。请参阅此处@Where 上的段落:baeldung.com/hibernate-dynamic-mapping。 Hibernate 还提供动态过滤器,但 @Where 似乎是您正在寻找的。 docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/… 【参考方案1】:

您可以使用 Hibernate 的 @Where 注释从关联中过滤元素。您可以在Hibernate Tip 中找到示例和说明。

这是它的简短版本:

您可以将 SQL sn-p 设置为 @Where 注释的 clause 属性的值。因此,您的映射应如下所示:

@OneToMany
@Where(clause = "active = 1")
private Set<B> b; 

而且你可以用同样的方法来排除那些不在时间范围内的

@OneToMany
@Where(clause = "active_from >= now() and (active_to is null or active_to < now())")
private Set<B> b; 

【讨论】:

以上是关于使用具有一对多关系的 JPA 映射实体,如何添加连接条件的主要内容,如果未能解决你的问题,请参考以下文章

JPA中实现单向一对多的关联关系

JPA映射关系

JPA学习笔记——映射一对多关联关系

JPA的一对多,多对多用法

JPA 单向一对多关联关系

关于JPA一对一,一对多(多对一),多对多的详解