Hibernate @Filter在JPA中不起作用?

rab*_*azl 5 java hibernate jpa one-to-many hibernate-mapping

我正在使用JPA和Hibernate作为JPA提供程序.我无法弄清楚如何配置我的实体以将休眠过滤器应用于一对多关联.

Master收藏了一个Details.这是我的实体定义:

@Entity
public class Master extends Base {
    private List<Detail> details;

    @OneToMany
    @OrderColumn
    @JoinTable(name = "master_details")
    @Filter(name = "notDeleted")
//    @Where(clause = "deleted = 'false'")
    public List<Detail> getDetails() {
        return details;
    }

    public void setDetails(List<Detail> details) {
        this.details = details;
    }
}

@Entity
@FilterDef(name = "notDeleted", defaultCondition = "deleted = false")
public class Detail extends Base {
    private Boolean deleted = false;

    public Boolean getDeleted() {
        return deleted;
    }

    public void setDeleted(Boolean deleted) {
        this.deleted = deleted;
    }
}
Run Code Online (Sandbox Code Playgroud)

Base没什么特别的,但一个简单的MappedSuperClass:

@MappedSuperclass
public class Base {
    private Long id;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }
}
Run Code Online (Sandbox Code Playgroud)

当加载一个Masterby时entityManager.find(Master.class, mid),过滤器应该防止所有Details加载,但我检查了hibernate(by show_sql=true)生成的sql查询,并且在加载master的详细信息时没有添加where子句!hibernate生成的示例查询是:

select
    details0_.Master_id as Master1_6_1_,
    details0_.details_id as details2_1_,
    details0_.details_ORDER as details3_1_,
    detail1_.id as id7_0_,
    detail1_.deleted as deleted7_0_,
from
    master_details details0_ 
inner join
    Detail detail1_ 
        on details0_.details_id=detail1_.id 
where
    details0_.Master_id=?
Run Code Online (Sandbox Code Playgroud)

经过一些搜索后,有一些提示"按ID加载不会使用过滤器,使用查询"所以我尝试了以下但没有收益:(

entityManager.createQuery("from Master where id=" + mid).getSingleResult();
Run Code Online (Sandbox Code Playgroud)

但是,如果@Where上面的getDetails被取消注释(而不是@Filter),它的子句被添加到由hibernate生成的查询中(但我不能使用@Where)

Vla*_*cea 6

过滤器需要手动激活:

session.enableFilter("myFilter").setParameter("myFilterParam", "some-value");
Run Code Online (Sandbox Code Playgroud)

但过滤器需要一个参数,你似乎不需要一个参数.

所以,如果你添加

@org.hibernate.annotations.Where(clause="deleted=false")        
public List<Detail> getDetails() {
    return details;
}
Run Code Online (Sandbox Code Playgroud)

你应该得到一个未删除的列表Details.

我不明白为什么你会使用这个1<>0条件.