【问题标题】:Hibernate @Filter on @ManyToOne在@ManyToOne 上休眠@Filter
【发布时间】:2014-11-28 00:48:54
【问题描述】:

能否解释一下为什么在@ManyToOne 关系上设置@Filter 不起作用? 这里我有一个非常简单的例子来说明这一点:

我在我的数据库中创建了两个简单的表(foo 和 bar)

Foo: id/id_bar
bar: id/name/state (state can be active or inactive)

和我的实体:

@Entity
@FilterDef(name = "foo_active")
@Table(name = "foo")
public class Foo extends AbstractTimestampEntity implements Serializable {


    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "id")
    private Integer id;

    @ManyToOne(cascade = CascadeType.DETACH, fetch = FetchType.LAZY)
    @JoinColumn(name = "bar")
    @Filter(name = "foo_active", condition = "state='active'")
    private Bar bar;
}

@Entity
@Table(name = "foo")
public class Bar extends AbstractTimestampEntity implements Serializable {


    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "id")
    private Integer id;

    @Column(name = "name")
    private String name;

    @Column(name = "state")
    private String state;
}

现在当我运行这个查询时

@Query("SELECT f FROM Foo f")
public List<Foo> getTest();

它返回 Foo 的全部内容(活动和非活动......)它看起来过滤器没有被激活,即使我在查询之前运行很艰难

Session session = entityManager.unwrap(Session.class);
session.enableFilter("foo_active")

在日志中我可以看到:

0:47:33.878 [Test worker] DEBUG o.h.h.i.ast.QueryTranslatorImpl - HQL: SELECT f FROM pl.jcommerce.ocean.services.model.Foo f
00:47:33.878 [Test worker] DEBUG o.h.h.i.ast.QueryTranslatorImpl - S**QL: select foo0_.id as id1_5_, foo0_.created as created2_5_, foo0_.updated as updated3_5_, foo0_.bar as bar6_5_ from foo foo0_**

如你所见,有“WHERE bar.state='active'”子句....

有人可以帮我解决这个问题吗?

谢谢!

【问题讨论】:

    标签: hibernate jpa filter many-to-one


    【解决方案1】:

    你可以试试这个:代替@ManyToOne字段上的@Filter,在class Foo上添加这个过滤器:

    @Filter(name = "foo_active", condition = "bar in (select id from Bar where state = 'active')")
    

    请注意,这可能会导致查询效率低下。

    【讨论】:

      【解决方案2】:

      我最近与@ManyToOne 一起使用时遇到了与@Filter 相同的问题。诀窍是在目标实体上使用@Filter,而不是在关联上。

      @Entity
      @Table(name = "foo")
      @Filter(name = "foo_active", condition = "state='active'")
      public class Bar
      

      Foo 类中的关联应该是这样的:

      @ManyToOne(cascade = CascadeType.DETACH, fetch = FetchType.LAZY)
      @JoinColumn(name = "bar")
      private Bar bar;
      

      希望这会有所帮助!

      【讨论】:

      • 多对一休眠 XML 映射如何实现
      猜你喜欢
      • 2023-03-22
      • 2018-07-30
      • 2021-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多