关于ManyToOne关系的Hibernate @Where注释

问题描述 投票:3回答:1

我最近开始重构我的项目,因为我必须在我的一些表中添加一个额外的列。额外列是枚举(待定或活动)。由于这种改变,我现在需要重构我的所有查询,如果状态为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;

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

谢谢

java hibernate jpa where hibernate-mapping
1个回答
0
投票

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

因此,您可以为@WherePlace保留Tag子句,而对于PlaceTags,您需要使用JPQL查询:

select pt
from PlaceTag pt
join pt.tag t
join pt.place p
where 
    t.state='ACTIVE' and p.state='ACTIVE'

至少在@WhereJoinTable注释被用于for many-to-one associations之前。

© www.soinside.com 2019 - 2024. All rights reserved.