@OneToMany -如何跳过标记的子元素?



我拥有的两个实体:CountryUser

@Entity(name = "Country")
@Table(name = "countries")
public class Country {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToMany(cascade = CascadeType.ALL,
orphanRemoval = true)
private List<User> users = new ArrayList<>();
}
@Entity(name = "User")
@Table(name = "users")
public class User {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private boolean removed;
}

实体User有一个属性,removed类型为boolean,我们需要跳过/忽略所有removed等于trueUser

Hibernate是否提供了任何合适的机制来实现我的目标?

p。S:谷歌说,潜在的我可以使用注释:@JoinColumn,@JoinColumnOrFormula,但根据我读过的文档,上面提到的注释属于@ManyToOne场景,在我的特殊情况下,我有@OneToMany关系。

对于hibernate,在实体上使用@Where应该可以达到目的。这将阻止任何将已移除标志设置为true的用户被加载。您可以在hibernate文档

中找到更多信息。如果您只希望它在集合上,则可以在关系

上添加注释。
@Entity(name = "Country")
@Table(name = "countries")
public class Country {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToMany(cascade = CascadeType.ALL,
orphanRemoval = true)
@Where( clause = "removed = false" ) // <- here
private List<User> users = new ArrayList<>();
}

或者,如果您根本不想加载任何已删除的用户,则可以将注释添加到类中。

@Entity(name = "User")
@Table(name = "users")
@Where( clause = "removed = false" ) // <- here
public class User {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private boolean removed;
}

需要注意的是,我还没有使用过这种方法,但我认为,如果你有其他实体链接到一个将标志设置为true的用户,你需要更新注释以允许为空。

例如,想象一个电子商务网站,一个订单链接到一个用户。加载链接到已删除用户的订单将失败,或者您可以修改注释,使其返回具有null用户的订单。我希望这是有意义的!

最新更新