我最近开始重构我的项目,因为我必须在我的一些表中添加一个额外的列。额外列是枚举(待定或活动)。由于这种改变,我现在需要重构我的所有查询,如果状态为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;
这可能吗?或者我是否必须明确地编写查询?
谢谢
正如您已经发现的那样,或仅仅使用案例,@Where
子句就可以了,但在您的情况下,您希望按位置和标记过滤PlaceTag
,因此在这种情况下需要连接。
因此,您可以为@Where
和Place
保留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之前。