关于ManyToOne关系的Hibernate @Where注释

时间:2014-11-27 17:06:13

标签: java hibernate jpa where hibernate-mapping

我最近开始重构我的项目,因为我必须在我的某些表中添加一个额外的列。额外列是枚举(待定或活动)。 由于这种改变,我现在需要重构我的所有查询,如果状态为ACTIVE,则只检索一行。

经过一些研究后,我发现我们可以使用@Where注释来注释实体。它在一个简单的列上使用它,但我的表看起来像这样:

@Where(clause = 'state='ACTIVE'")
@Entity
public class Place {

  @Column(name="id_place")
  private String placeId;

  @Column(name="name")
  private String palceName;

@OneToMany(mappedBy = "place")
    private Set<PlaceTag> placeTag;

  ...
  ...
}

@Where(clause = 'state='ACTIVE'")
@Entity
public class Tag {

  @Column(name="id_tag")
  private String tagId;

  @Column(name="name")
  private String tagName;

   @OneToMany(mappedBy = "tag")
    private Set<PlaceTag> placeTag;
   ... 
   ...
}

@Where(clause = 'poi.state='ACTIVE' AND tag.state='ACTIVE")
@Entity
public class PlaceTag {

  @Column(name="id")
  private String id;

  @ManyToOne(cascade = CascadeType.DETACH, fetch = FetchType.LAZY)
  @JoinColumn(name = "place_id")
  private Place place;

  @ManyToOne(cascade = CascadeType.DETACH, fetch = FetchType.LAZY)
  @JoinColumn(name = "tag_id")
  private Tag tag;

  ...
  ...

}

现在我的问题是如何才能使这句话只返回ACTIVE的地方和标签?

SELECT pt FROM PlaceTag pt;

这可能吗?或者我是否必须明确地编写查询?

谢谢

1 个答案:

答案 0 :(得分:0)

正如您已经发现的那样,或仅仅使用案例@Where子句就好了,但在您的情况下,您希望按地点和标记过滤PlaceTag,因此需要加入这种情况。

因此,您可以保留@WherePlace的{​​{1}}子句,而对于Tag,您需要使用JPQL查询:

PlaceTags

至少在@WhereJoinTable注释工作for many-to-one associations之前。