hibernate使用@where实现条件过滤功能

来源:互联网 发布:东村明子 知乎 编辑:程序博客网 时间:2024/05/01 02:33

编程中最常用的功能,增删改查,而实际业务中真正物理删除数据的情况是很少的,基本都有使用逻辑删除,通常采用一个标志位,比如flag,查询的时候,flag=1的数据查出,flag=0的数据过滤掉.

使用hibernate的时候,通常不再直接才做sql语句,而是操作实体和HQL相结合的方式,只要维护好实体之间的关系,增删改查都可以使用极其简单的方式来完成,哪怕关联了好多张表好多个实体.

逻辑删除的时候就是更新一张表,那也只需要维护实体的一个标志位就可以了,不需要写HQL语句,如果要把主表和从表里的标志位都改变了,还是需要维护实体之间的关系,每个实体的标志位都设为0就行了.

但是问题出来了,查询的时候如何才能把标志位的条件加上,而我并不想写HQL语句,不想写类似于"from Entity1 inner jion Entity2 on Etity1.id = Entity2.eId and Etity1.flag = 1 and Etity2.flag = 1" ,如果是少量的实体关联,比如两三个还凑合,但是如果有十几个实体管理,写起来岂不是要繁琐无比啊,而且一不小心就容易出错.

仔细看一下控制台打印的数据,hibernate的查询其实也是把HQL转换成SQL来执行的(当然要这样做),这就给了我们启发,hibernate是不是有一个注解专门用来添加where条件的呢?也就是每次从HQL转换虫Sql都要给这个表添加这么条件.如果我是hibernate的设计者,我肯定要这么做的,因为实现起来不难,而方面性不言而喻.

问了好几个人都不知道这么个东西,网上找了半天,不知道该使用什么关键字来搜索,但一直坚信hibernate肯定没那么菜,一定这么个解决方案.最后才确定@Where这么个注解

其里面只有一个参数clause,完整用法是:

@Where(clause = "VALID_FLAG=1")

可以加在实体类上,也可以加在字段的get方法上,也支持这样的这样的办法

@Where(clause = "VALID_FLAG=1")
List<Topic> topics;

这个条件的意思是进行关联查询的时候,我只把Topic中VALID_FLAG = 1的查询出来.

在表上加一个意味着查询自己的时候只查询VALID_FLAG = 1等于1的


有兴趣的同学可以去Google中搜索,百度中好像没有的.

1 0