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

时间:2018-11-20 05:22:05

标签: hibernate jpa

考虑到这种情况:该数据库是在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; 

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

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

类似地,在某些情况下,条目具有有效的日期范围,因此我们必须添加类似于

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

1 个答案:

答案 0 :(得分:1)

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

这是它的简短版本:

您可以将一个SQL代码段设置为clause批注的@Where属性的值。因此,您的映射应如下所示:

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