使用具有一对多关系的 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 映射实体,如何添加连接条件的主要内容,如果未能解决你的问题,请参考以下文章