条件/复合JoinColumn在JPA / Hibernate中

时间:2013-05-02 08:58:38

标签: hibernate jpa join joincolumn

在我的一个课程中,比如位置,我有类似的东西:

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的魔术师。

我怎样才能做到这一点?

感谢您的关注。

3 个答案:

答案 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),但我还没有测试过它们。