@Query注解配合@Where注解使用注意事项

自定义的sql(nativeQuery = true),不会拼上@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、付费专栏及课程。

余额充值