Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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
Hibernate 在@manytone上休眠@Filter_Hibernate_Jpa_Filter_Many To One - Fatal编程技术网

Hibernate 在@manytone上休眠@Filter

Hibernate 在@manytone上休眠@Filter,hibernate,jpa,filter,many-to-one,Hibernate,Jpa,Filter,Many To One,请解释一下为什么在@manytone关系上使用@Filter不起作用? 这里我有一个非常简单的例子来说明这一点: 我在数据库中创建了两个简单的表(foo和bar) 以及我的实体: @Entity @FilterDef(name = "foo_active") @Table(name = "foo") public class Foo extends AbstractTimestampEntity implements Serializable { private static fin

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

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

以及我的实体:

@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();
在日志中,我可以看到:

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'”子句

有人能帮我吗


谢谢大家!

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

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

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

最近,当与
@manytone
一起使用时,我遇到了与
@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;
希望这有帮助

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