@ManyToOne 上的 Hibernate @Filter

Joh*_*y19 5 hibernate jpa filter many-to-one

有人可以解释一下为什么在 @ManyToOne 关系上使用 @Filter 不起作用吗?这里我有一个非常简单的例子来展示这一点:

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

Foo: id/id_bar
bar: id/name/state (state can be active or inactive)
Run Code Online (Sandbox Code Playgroud)

和我的实体:

@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;
}
Run Code Online (Sandbox Code Playgroud)

现在当我运行这个查询时

@Query("SELECT f FROM Foo f")
public List<Foo> getTest();
Run Code Online (Sandbox Code Playgroud)

它返回 Foo 的完整内容(活动以及非活动......)看起来过滤器没有激活,即使我在查询之前运行

Session session = entityManager.unwrap(Session.class);
session.enableFilter("foo_active")
Run Code Online (Sandbox Code Playgroud)

在日志中我可以看到这一点:

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_**
Run Code Online (Sandbox Code Playgroud)

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

有人可以帮我吗?

谢谢你!

maz*_*azi 2

您可以尝试以下操作:在@Filter@ManyToOne添加此过滤器,而不是在字段上class Foo

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

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