@Where子句在休眠联接查询中不起作用

Zaf*_*ncu 4 java sql spring hibernate hibernate-annotations

我有2个带有@Where注释的实体。第一个是类别;

@Where(clause = "DELETED = '0'")
public class Category extends AbstractEntity
Run Code Online (Sandbox Code Playgroud)

具有以下关系:

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "category")
private Set<SubCategory> subCategories = Sets.newHashSet();
Run Code Online (Sandbox Code Playgroud)

第二个实体是SubCategory;

@Where(clause = "DELETED = '0'")
public class SubCategory  extends AbstractEntity
Run Code Online (Sandbox Code Playgroud)

并包含对应关系;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "CATEGORY_ID")
private Category category;
Run Code Online (Sandbox Code Playgroud)

每当我调用以下Dao方法时;

@Query(value = "select distinct category from Category category join fetch category.subCategories subcategories")
public List<Category> findAllCategories();
Run Code Online (Sandbox Code Playgroud)

我得到以下sql查询;

    select
        distinct category0_.id as id1_3_0_,
        subcategor1_.id as id1_16_1_,
        category0_.create_time as create2_3_0_,
        category0_.create_user as create3_3_0_,
        category0_.create_userip as create4_3_0_,
        category0_.deleted as deleted5_3_0_,
        category0_.update_time as update6_3_0_,
        category0_.update_user as update7_3_0_,
        category0_.update_userip as update8_3_0_,
        category0_.version as version9_3_0_,
        category0_.name as name10_3_0_,
        subcategor1_.create_time as create2_16_1_,
        subcategor1_.create_user as create3_16_1_,
        subcategor1_.create_userip as create4_16_1_,
        subcategor1_.deleted as deleted5_16_1_,
        subcategor1_.update_time as update6_16_1_,
        subcategor1_.update_user as update7_16_1_,
        subcategor1_.update_userip as update8_16_1_,
        subcategor1_.version as version9_16_1_,
        subcategor1_.category_id as categor11_16_1_,
        subcategor1_.name as name10_16_1_,
        subcategor1_.category_id as categor11_3_0__,
        subcategor1_.id as id1_16_0__ 
    from
        PUBLIC.t_category category0_ 
    inner join
        PUBLIC.t_sub_category subcategor1_ 
            on category0_.id=subcategor1_.category_id 
    where
        (
            category0_.DELETED = '0' 
        )
Run Code Online (Sandbox Code Playgroud)

您能否告诉我为什么缺少上述查询

和subcategor1_.DELETED ='0'

里面的哪里块?

diy*_*diy 6

我刚刚在我的项目中解决了类似的问题。

不仅可以在实体上添加@Where注释,还可以在子集合上添加@Where注释。

根据javadoc

要添加到元素的Entity或集合的目标实体的 Where子句

就您而言,它就像:

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "category")
@Where(clause = "DELETED = '0'")
private Set<SubCategory> subCategories = Sets.newHashSet();
Run Code Online (Sandbox Code Playgroud)

在此处找到解决的类似问题

我相信这种解决方案与使用Hibernate过滤器相比没有那么侵入性。这些过滤器默认情况下处于禁用状态,并且在Session级别运行,因此每次打开新Session时启用它们都是额外的工作,尤其是当您的DAO通过Spring Data之类的抽象进行工作


Yus*_* K. 0

这是一个快速回复;

@Where(clause = "DELETED = '0'")
public class SubCategory  extends AbstractEntity
Run Code Online (Sandbox Code Playgroud)

Where直接查询SubCategry时生效。为了不删除子类别,请使用Hibernate Filters,如此 所示