【问题标题】:Hibernate execute OneToMany if condition satisfied如果条件满足,休眠执行 OneToMany
【发布时间】:2016-12-17 03:00:21
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    根据AnotherEntity 的上下文,您可能能够解决此问题的一种方法是使用休眠过滤器。我过去使用过类似的东西,我们有一个特定实体类型的OneToMany,但根据用户访问权限只返回某些值。

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

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

    更新

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

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

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

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

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

    【讨论】:

    • 感谢您的回答。然而,这不是我要找的。 '@Filter'、'@Where' 注释正在过滤结果(它在 sql 语句中添加了 where 子句)。 '@Formula' 是一种在数据库端进行计算的方法。我正在寻找的是一种指示 HIbernate 是否进行加入的方法。如果 MyEntity 中的条件属性为真,则执行联接,否则什么也不做。
    • 了解您为什么要实现这种特定行为会很有帮助,因为也许还有其他方法可以解决您的问题。
    • 对于大多数“MyEntity”没有“AnotherEntity”关系。所以我想避免的是 Hibernate 查询数据库一无所获。因为如果“MyEntity”表包含一百万行,即使查询只用了 1 毫秒就可以执行,花在查询上的时间是巨大的。
    猜你喜欢
    • 2018-12-21
    • 2018-01-10
    • 2011-01-07
    • 2012-01-24
    • 2013-07-23
    • 1970-01-01
    • 2012-10-05
    • 2013-08-08
    • 2018-06-01
    相关资源
    最近更新 更多