Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate@Where注释在多通关系上_Java_Hibernate_Jpa_Where_Hibernate Mapping - Fatal编程技术网

Java Hibernate@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注释来注释实体。我在一个简单的列上使用它时效果很好,但我的表如下所示:

@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'