3

在我的一门课中,比如说位置,我有这样的东西:

private List<Magician> magicians;

...

@OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name="location_id")
public List<Magician> getMagicians() {
    return magicians;
} 

public void setMagicians(List<Magician> magicians) {
    this.magicians = magicians;
}

魔术师有变量的地方

private Integer id;
private Integer location_id;
private Boolean active;

现在我想修改 getter 注释,以便只获取 active 为 true 的魔术师。

我怎样才能做到这一点?

感谢您的关注。

4

3 回答 3

2

首先,Magician 不应该有 location_id 字段。它应该有一个 Location 类型的字段。这将在两个实体之间建立双向关联:

@OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "location")
public List<Magician> getMagicians() {
    return magicians;
} 

...

@ManyToOne
@JoinColumn(name = "location_id")
public Location getLocation() {
    return this.location;
}

然后,为了回答您的问题,实体的状态和关联不用于实现特定的用例或查询。您用于对数据库包含的内容进行建模。要获取给定位置的活跃魔术师,您应该简单地使用查询:

select m from Magician m where m.active = true and m.location = :location
于 2013-05-02T09:04:29.397 回答
1

我不会在实体级别执行这项工作,而是使用EntityManager创建查询来执行它。正如 JB 提到的,您需要将位置添加为复合对象而不是整数。

//在方法中

List<Magician> magicians = 
   em.createQuery("select m from Location l join Magician m where m.active = true and
   l.[specify id here] = :locationId", Magician.class).setParameter("locationId",
   1).getResultList();
于 2013-05-02T09:09:02.790 回答
0

在 Hibernate 中,我的问题可以使用过滤器来解决,如下所述:https ://stackoverflow.com/a/6920847/1966869 。我刚刚测试过并且看起来非常实用的 xml 版本在此处进行了描述:http ://www.mkyong.com/hibernate/hibernate-data-filter-example-xml-and-annotation/ 。可能还有其他使用 @Where (如何在 Hibernate 中使用 @Where)或 @JoinFormula (@JoinFormula 和 @OneToMany 定义 - 糟糕的文档)的解决方案,但我没有测试它们。

于 2013-05-02T11:57:18.207 回答