@Where子句在hibernate join查询中不起作用
我有2个@Where注释实体。 第一个是分类;
@Where(clause = "DELETED = '0'") public class Category extends AbstractEntity
它有以下关系;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "category") private Set 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 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' )
你能告诉我为什么上面的查询缺乏
和subcategor1_.DELETED =’0′
在哪里挡?
我刚刚在我的项目中解决了类似的问题。
可以将@Where注释不仅放在Entity上,还可以放在子集合上。
根据javadoc :
Where子句添加到元素集合的实体或目标实体
在你的情况下,它会像:
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "category") @Where(clause = "DELETED = '0'") private Set subCategories = Sets.newHashSet();
请在此处找到解决的类似问题
我相信因此,与使用Hibernatefilter相比,解决方案并不具有侵入性。默认情况下,这些filter被禁用并在会话级别运行,因此每次新的Session打开时都会启用它们,特别是当您的DAO通过Spring Data等抽象工作时
这是一个快速回复;
@Where(clause = "DELETED = '0'") public class SubCategory extends AbstractEntity
直接查询SubCategry时会在Where
生效。 要不删除子类别,请使用Hibernate Filters作为示例
- 由于Bean Validation API而无法启动Hibernate Validator
- Spring @Transactional和Hibernate @LockMode注释是如何相关的
- PostgreSQL串行类型的Hibernate注释
- Hibernate和@JoinFormula:org.hibernate.mapping.Formula无法强制转换为org.hibernate.mapping.Column
- 使用Hibernate和Guice管理JavaSE中的事务
- 如何使用Hibernate检索一组成员对象?
- 无法捕获ConstraintViolationException
- 如何从hibernate提供程序知道底层数据库名称
- 收到org.hibernate.TypeMismatchExceptionexception