hibernate的@Where注释作用是对其左右的查询语句后面加上一个限制条件,一般用在逻辑删的场合,这样就不用每个查询都加上 “and deleted = 1” 这类的,框架会自己给你加上。类似的还有@Filter,这个灵活度更高,可以自由控制是否需要过滤。具体的可以看官方文档。
Hibernate ORM 5.5.8.Final User Guidehttps://docs.jboss.org/hibernate/orm/5.5/userguide/html_single/Hibernate_User_Guide.html#pc-where
不过问题自然而然的也来了,有时候业务需要忽略这个过滤,去搜索被“删除”的记录。这不,我这边产品提了一个回收站功能……
回头去把@Where删除或者改成@Filter都不太现实,因为之前已经写很多查询都去修改成本过大而且有风险。那么有没有办法忽略这个@Where的注释呢?
一般来说,在之前的entity上是没办法的,因为@Where最终 *** 作,只要最终的sql是hibernate生成的,那么必然会把@where里面的语句加上。不过我们还是有2个方法避开这个限制。
方法1:直接使用SQL,既然hibernate的生成的SQL都会加上,那么不用框架生成的SQL即可。
所以可以比如,在JAP的Repository里这样写
@Query(value = "select * from my_table e where e.id = ?1", nativeQuery = true) MyEntity getDeleted(Integer id);
或者用session
@Resource(name = "sessionFactory") private SessionFactory sessionFactory; public Session getSession() { return sessionFactory.getCurrentSession(); } public List queryBySql(String sql) { List
这种方法适合用在业务比较简单的场景,比如只有一两个查询的情况下。因为这种方式等于是弃用了框架的一部分功能,如果复杂的业务场景就会显得比较麻烦。实际上第二种方法可以更好的解决的问题。
方法2:再写一个class重新映射这张表
没错,方法就是这么简单。
// 之前的实体 @Table(name = "my_table") @SQLDelete(sql = "UPDATE my_table SET deleted = 1 WHERe id = ?") @SQLDeleteAll(sql="UPDATE my_table SET deleted = 1 WHERe id = ?") @Where(clause = "deleted = 0") public class MyEntity { // 各种字段 } // 新的实体 @Table(name = "my_table") public class MyNewEntity { // 把字段复制下来即可 }
然后只对新的class *** 作即可。这样就可以用到框架的所有功能了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)