我有 2 个带有 @Where 注释的实体。第一个是类别;
@Where(clause = "DELETED = '0'")
public class Category extends AbstractEntity
有如下关系;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "category")
private Set<SubCategory> subCategories = Sets.newHashSet();
第二个实体是 SubCategory;
@Where(clause = "DELETED = '0'")
public class SubCategory extends AbstractEntity
并且包含对应关系;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "CATEGORY_ID")
private Category category;
每当我调用以下 Dao 方法时;
@Query(value = "select distinct category from Category category join fetch category.subCategories subcategories")
public List<Category> findAllCategories();
我得到了以下 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'
)
你能告诉我为什么上面的查询缺少
and subcategor1_.DELETED = '0'
在它的 where block 中?
最佳答案
我刚刚在我的项目中解决了类似的问题。
@Where 注释不仅可以放在实体上,也可以放在您的子集合上。
根据javadoc :
Where clause to add to the element Entity or target entity of a collection
在你的情况下,它会像:
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "category")
@Where(clause = "DELETED = '0'")
private Set<SubCategory> subCategories = Sets.newHashSet();
请查找已解决的类似问题here
我相信与使用 Hibernate 过滤器相比,解决方案没有侵入性。这些过滤器在默认情况下被禁用并在 session 级别运行,因此每次打开新 session 时启用它们是额外的工作,尤其是当您的 DAO 通过像 Spring Data 这样的抽象工作时
关于java - @Where 子句在 hibernate 连接查询中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36119169/