我想知道是否存在一种告诉Hibernate仅在条件满足时执行@OneToMany后面的查询的方法。 这可能是一个非常简单的例子:
@Entity
public class MyEntity {
...
private Long id;
private boolean condition;
private List<AnotherEntity> anotherEntity;
@Id
@Column(name = "ID", nullable = false)
@GeneratedValue(strategy = GenerationType.AUTO)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Basic
@Column(name = "CONDITION")
public Boolean getCondition() {
return isContentChanged;
}
public void setIsContentChanged(Boolean condition) {
this.condition = condition;
}
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "SECOND_ID")
**@Conditional(clause = "CONDITION = true")**
public List<AnotherEntity> getAnotherEntity() {
return anotherEntity;
}
public void setAnotherEntity(List<AnotherEntity> anotherEntity) {
this.anotherEntity = anotherEntity;
}
}
@Entity
public class AnotherEntity {
private id
private secondId
...
}
所以我想要的是: - 如果注释@Conditional中的条件满足,则Hibernate执行与@OneToMany注释相关的查询 - 如果注释@Conditional中的条件不满足,则Hibernate对@OneToMany注释不执行任何操作
我不知道Hibernate中是否已存在。否则可能是一个很棒的新功能。
答案 0 :(得分:0)
根据AnotherEntity
的上下文,您可以解决此问题的一种方法是使用Hibernate过滤器。我过去使用过类似的东西,我们有OneToMany
特定的实体类型,但只根据用户访问权限返回某些值。
其他方式可能包括使用@Formula
或@Where
注释。
从here开始,Hibernate 5.2的文档中提供了所有这三个选项。
更新:
我要解释的内容仅适用于明确定义为LAZY
获取类型的关联。如果您保留默认的EAGER
抓取类型或明确将其设置为EAGER
,则以下内容不适用。
鉴于您的关联使用LAZY
提取类型,您可以在运行时将条件作为数据访问层查询的一部分进行烘焙。没有注释,因此它将成为您的代码的一部分,但它至少允许您在运行时最小化连接。
对于条件为 true 的情况,如果使用已弃用的Hibernate Criteria API,或者您希望使用{{1},则指定应加载集合EAGER
如果使用JPA Criteria API。请注意,JOIN/JOIN FETCH
只允许您再次应用谓词来过滤根实体;但JOIN
也将为您填充该集合。
这不允许您过滤集合结果,但它至少为您提供了一种消除连接的方法,同时允许连接在运行时根据某些条件成为查询的一部分。
这是非常容易分析的,其中搜索表单有10个可搜索字段;但是,如果给定字段具有值,则仅将适当的谓词应用于基本查询;但是,如果未提供值来提高运行时查询性能,则不会向基本查询添加任何谓词,也可能不会添加任何特定联接。