编程中最常用的功能,增删改查,而实际业务中真正物理删除数据的情况是很少的,基本都有使用逻辑删除,通常采用一个标志位,比如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")
@Where(clause = "deleted='y'") List<Topic> topics;
原文:http://blog.csdn.net/salerzhang/article/details/40659679