如果条件满足,则Hibernate执行OneToMany

时间:2016-08-10 15:55:20

标签: java hibernate annotations conditional-statements one-to-many

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

1 个答案:

答案 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个可搜索字段;但是,如果给定字段具有值,则仅将适当的谓词应用于基本查询;但是,如果未提供值来提高运行时查询性能,则不会向基本查询添加任何谓词,也可能不会添加任何特定联接。