在我的一个课程中,比如位置,我有类似的东西:
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的魔术师。
我怎样才能做到这一点?
感谢您的关注。
答案 0 :(得分:2)
首先,魔术师不应该有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
答案 1 :(得分: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();
答案 2 :(得分:0)
在Hibernate中,我的问题可以使用过滤器解决,如下所述:https://stackoverflow.com/a/6920847/1966869。 xml版本,我刚刚测试过,看起来很实用,在这里描述:http://www.mkyong.com/hibernate/hibernate-data-filter-example-xml-and-annotation/。 可能有其他解决方案使用@Where(How to use @Where in Hibernate)或@JoinFormula(@JoinFormula and @OneToMany definition - poor documentation),但我还没有测试过它们。