JPA 一对多滤波

2022-09-01 13:12:20

我们正在嵌套多个实体。但是,在检索时,我们只想获取那些处于活动状态的实体。

@Entity
public class System {
  @Id
  @Column(name = "ID")
  private Integer id;

  @OneToMany(mappedBy = "system")
  private Set<Systemproperty> systempropertys;
}

@Entity
public class Systemproperty {
  @Id
  @Column(name = "ID")
  private Integer id;

  @Id
  @Column(name = "ACTIVE")
  private Integer active;
}

请求 I 时,我只想获取 (active = 1) 的属性。Systempropertiesactive

四处搜索,我发现了一些休眠注释以及使用子查询的可能性。然而,两者都不适合我。尽管我们目前正在使用休眠状态,但我正在考虑用Eclipselink替换它,因为我们目前必须使用预先加载,并且我们可能会遇到性能问题。子查询实际上效果不佳,因为我们嵌套了多个级别。

Eclipselink似乎有一个@Customizer注释可以工作,但是它似乎遵循与休眠注释不同的概念,并且在切换时会导致额外的开销。@FilterDef

似乎不允许进一步过滤。有没有标准的JPA方法来解决这个问题?@JoinColumn


答案 1

使用@Where进行的另一种休眠方式:

@Entity
public class System {
  @Id
  @Column(name = "ID")
  private Integer id;

  @OneToMany(mappedBy = "system")
  @Where(clause = "active = true")
  private Set<Systemproperty> systempropertys;
}

@Entity
public class Systemproperty {
  @Id
  @Column(name = "ID")
  private Integer id;

  @Id
  @Column(name = "ACTIVE")
  private Integer active;
}

答案 2

AFAIK没有基于JPA的便携式方法来做到这一点。一个干净的,但效率有点低下的解决方案是在Java端执行所有操作,并创建一个getter,该getter手动迭代映射并返回一组不可变的活动属性。getActiveSystemproperties()systempropertys


推荐