我最近开始重构我的项目,因为我必须在一些表中添加额外的列。额外的列是一个枚举(待定或活动)。
由于这一更改,我现在需要重构所有查询,以便仅在状态为“活动”时检索行。
经过一些研究,我发现我们可以使用 @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
and 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 https://docs.jboss.org/hibernate/core/3.5/api/org/hibernate/annotations/WhereJoinTable.html注释已生效对于多对一关联 https://hibernate.atlassian.net/browse/HHH-4335 too.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)