JPA一对多过滤

Udo*_*eld 15 java jpa one-to-many

我们正在筑巢几个实体.但是在检索时我们只想获得那些活跃的实体.

@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;
}
Run Code Online (Sandbox Code Playgroud)

在请求时Systemproperties我只想获取属性active(active = 1).

搜索我发现了一些hibernate注释和使用子查询的可能性.然而,两者都不适合我.即使我们目前正在使用hibernate,我也在考虑用Eclipselink替换它,因为我们目前不得不使用预先加载,我们可能会遇到性能问题.子查询不能很好地工作,因为我们正在嵌套几个级别.

Eclipselink似乎有一个可以工作的@Customizer注释,但它似乎遵循与hibernate @FilterDef注释不同的概念,并且在切换时会产生额外的开销.

@JoinColumn似乎没有允许进一步的筛选.是否有标准的JPA方法来解决这个问题?

Ada*_*yga 7

AFAIK 没有可移植的基于 JPA 的方法来做到这一点。一个干净但有点低效的解决方案是在 Java 端做所有事情,并创建一个 getter getActiveSystemproperties(),手动迭代映射systempropertys并返回一组不可变的活动属性。


dan*_*ial 6

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

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

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

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

  @Id
  @Column(name = "ACTIVE")
  private Integer active;
}
Run Code Online (Sandbox Code Playgroud)

  • 你救了我的命。 (2认同)