gpt4 book ai didi

java - 如果条件满足,Hibernate 执行 OneToMany

转载 作者:太空宇宙 更新时间:2023-11-04 12:20:42 24 4
gpt4 key购买 nike

我想知道是否存在一种方法来告诉 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 中是否已经存在这种情况。否则可能会是一个很棒的新功能。

最佳答案

根据 AnotherEntity 的上下文,您可以解决此问题的一种方法是使用 Hibernate Filter。我过去使用过类似的东西,我们有一个特定实体类型的 OneToMany,但仅根据用户访问返回某些值。

其他方法可能包括使用@Formula@Where注释。

所有这三个选项都可以在 Hibernate 5.2 的文档中找到,从 here 开始。 .

更新:

我要解释的内容仅适用于显式定义为 LAZY 获取类型的关联。如果您保留默认的 EAGER 获取类型或明确将其设置为 EAGER,则以下内容不适用。

鉴于您的关联使用 LAZY 获取类型,您可以在运行时将该条件烘焙为数据访问层查询的一部分。对此没有注释,因此它将成为代码的一部分,但它至少允许您在运行时最小化连接。

对于条件为true的情况,如果使用已弃用的 Hibernate Criteria API,您可以指定应该EAGER加载集合,或者如果使用 JPA Criteria API,则需要使用JOIN/JOIN FETCH。请注意,JOIN 只允许您再次对集合应用谓词来过滤根实体;但是 JOIN FETCH 也会为您填充集合。

这不允许您过滤集合结果,但它至少为您提供了一种消除连接的方法,同时允许连接根据某些条件在运行时成为查询的一部分。

这非常具有分析性,搜索表单有 10 个可搜索字段;但是,如果给定字段具有值,则仅将适当的谓词应用于基本查询;但是,如果未提供值来提高运行时查询性能,则不会向基本查询添加任何谓词,甚至可能不会添加任何特定连接。

关于java - 如果条件满足,Hibernate 执行 OneToMany,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38878277/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com