忽略hibernate的@Where注释

hibernate的@Where注释作用是对其左右的查询语句后面加上一个限制条件,一般用在逻辑删的场合,这样就不用每个查询都加上 “and deleted = 1” 这类的,框架会自己给你加上。类似的还有@Filter,这个灵活度更高,可以自由控制是否需要过滤。具体的可以看官方文档。

Hibernate ORM 5.5.8.Final User Guideicon-default.png?t=L9C2https://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<Object[]> list = getSession().createSQLQuery(sql).list();  
        return 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操作即可。这样就可以用到框架的所有功能了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值