忽略hibernate的@Where注释

忽略hibernate的@Where注释,第1张

忽略hibernate的@Where注释

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 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 *** 作即可。这样就可以用到框架的所有功能了。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4018823.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-10-22
下一篇 2022-10-22

发表评论

登录后才能评论

评论列表(0条)

保存