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