【问题标题】:Hibernate @Where annotation on a ManyToOne relation多对一关系上的休眠 @Where 注释
【发布时间】:2015-01-26 08:33:37
【问题描述】:

我最近开始重构我的项目,因为我不得不在我的某些表中添加一个额外的列。额外的列是一个枚举(Pending 或 Active)。 由于该更改,我现在需要重构所有查询,以便仅在状态为 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;

  ...
  ...

}

现在我的问题是如何让这个语句只返回处于活动状态的位置和标签?

SELECT pt FROM PlaceTag pt;

这可能吗?还是我必须显式编写查询?

谢谢

【问题讨论】:

  • 这个解决方案对我有用,谢谢

标签: java hibernate jpa where hibernate-mapping


【解决方案1】:

正如您已经发现的那样,或者只是用例,@Where 子句就可以了,但在您的情况下,您也想按地点和标签过滤 PlaceTag,因此在这种情况下需要加入。

因此,您可以为PlaceTag 保留@Where 子句,而对于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 之前工作。

【讨论】:

  • 感谢您的回答!我已经尝试过了,但似乎休眠不使用过滤器。在我的数据库中,我已将所有位置设置为 INACTIVE(1 除外)并将所有标签设置为 INACTIVE(1 除外),并且当我运行此查询时 List test = placeTagRepository.findAll(); findAll 将整个 PlaceTag 表返回给我
  • @Johny19 您是否按照文档使用 session.enableFilter 启用了过滤器?
  • 感谢两位的回复。我的项目目前正在使用 entityManager。所以我做了这样的事情:Session session = entityManager.unwrap(Session.class); session.enableFilter("place_active"); session.enableFilter("tag_active");但是说:org.hibernate.HibernateException:没有配置这样的过滤器[place_active]
  • 是的,它现在不再抱怨过滤器了。但仍然是这个查询 @Query("SELECT pt FROM PlaceTag");将 PlaceTag 全部归还给我
  • 也不适合我。我认为不应该因为不混淆人们而接受无效的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-12
  • 2012-03-22
  • 1970-01-01
  • 1970-01-01
  • 2011-04-13
  • 2013-05-24
相关资源
最近更新 更多