java - @Where 子句在 hibernate 连接查询中不起作用

标签 java sql spring hibernate hibernate-annotations

我有 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/

相关文章:

java - SPARK SQL 不存在或不存在

sql - 在ms-sql中找到最近的位置

java - 如何处理Jackson的无限递归

java - 为什么向Spring组件注入(inject)BeanFactory是正常的,而向Spring Bean注入(inject)BeanFactory却不正常?

spring - 用于 Spring Boot 应用程序的 JUnit @BeforeClass 非静态工作

java - 在 Spring boot 中从任意 bean 访问 EntityMamanger

java - 使用默认程序在 Java 中打开文件时出现问题

java - Jenkins : System. out.println 不在控制台窗口上打印任何内容

sql - 如何在 Oracle SQL 数据库中查找相关行

mysql - 获取今天是日期后 6 个月后的记录