Hibernate @Filter在@ManyToOne上的应用

5
请问为什么在@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'”子句...

请问有人可以帮忙吗?

谢谢!

2个回答

2
你可以尝试这样做:不要在@ManyToOne字段上添加@Filter,而是在class Foo上添加此过滤器:
@Filter(name = "foo_active", condition = "bar in (select id from Bar where state = 'active')")

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

我使用了@Where,但是在where子句中使用“bar in ()”这个想法对我帮助很大。 - DaniyalVaghar

0

最近在使用@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;

希望这能帮到你!


1
如何通过Hibernate的ManyToOne XML映射实现? - unknown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接