Java Hibernate@Where注释在多通关系上
我最近开始重构我的项目,因为我不得不在一些表中添加一个额外的列。额外列是枚举(挂起或活动)。 由于这一变化,我现在需要重构所有查询,以仅在状态为活动时检索一行 经过一些研究,我发现我们可以用@Where注释来注释实体。我在一个简单的列上使用它时效果很好,但我的表如下所示:Java Hibernate@Where注释在多通关系上,java,hibernate,jpa,where,hibernate-mapping,Java,Hibernate,Jpa,Where,Hibernate Mapping,我最近开始重构我的项目,因为我不得不在一些表中添加一个额外的列。额外列是枚举(挂起或活动)。 由于这一变化,我现在需要重构所有查询,以仅在状态为活动时检索一行 经过一些研究,我发现我们可以用@Where注释来注释实体。我在一个简单的列上使用它时效果很好,但我的表如下所示: @Where(clause = 'state='ACTIVE'") @Entity public class Place { @Column(name="id_place") private String place
@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;
...
...
}
这可能吗?或者我必须显式地编写查询
感谢您正如您已经发现的,或者简单地使用案例,
@Where
子句很好,但是在您的案例中,您也希望按位置和标记过滤PlaceTag
,因此在这种情况下需要一个join
因此,您可以为Place
和Tag
保留@Where
子句,而对于PlaceTags
,您需要使用JPQL查询:
select pt
from PlaceTag pt
join pt.tag t
join pt.place p
where
t.state='ACTIVE' and p.state='ACTIVE'
至少在注释完成之前。谢谢您的回答!我已经试过了,但hibernate似乎没有使用过滤器。在我的数据库中,我已将所有位置设置为非活动(1除外),将所有标记设置为非活动(1除外),当我运行此查询列表时,test=placeTagRepository.findAll();findAll把整个PlaceTag还给我table@Johny19您是否根据文档使用session.enableFilter启用了筛选器?谢谢您的回复。我的项目目前正在使用entityManager。所以我做了如下操作:Session Session=entityManager.unwrap(Session.class);session.enableFilter(“place_active”);session.enableFilter(“tag_active”);但是它说:org.hibernate.HibernateException:没有配置这样的过滤器[place_active]是的,它现在不再抱怨过滤器了。但仍然是这个查询@query(“从PlaceTag中选择pt”);返回我所有的位置标记也不为我工作。我认为不起作用的答案不应该因为不让人困惑而被接受。这个解决方案对我很有效,谢谢
select pt
from PlaceTag pt
join pt.tag t
join pt.place p
where
t.state='ACTIVE' and p.state='ACTIVE'