当接口规范方法名查询也无法满足你的需求(很少遇到),我们还可以使用@Query注解配合HQL查询语句的方式,使用过Hibernate的开发者应该很熟悉HQL,十分接近SQL语法。
场景
删除所有名字中含有jules的学生。
编写接口
@Query("delete from Student where name like ?1")
int deleteStudentByName(String name);
?1代表使用第一个参数,Student不能使用表名,而是实体的名字(HQL规范)。
编写测试类
@RequestMapping("deleteStudentByNameLike/{name}")
public int deleteStudentByNameLike(@PathVariable("name") String name){
String selectName = "%" + name + "%";
int i = studentDao.deleteStudent(selectName);
return i;
}
这里有一点要非常注意,如果在Student类上的注解@Entity上指定了name值,则HQL中使用指定的name值作为实体名字!
编译一下,然后在浏览器输入:http://127.0.0.1:8080/deleteStudentByNameLike/jules
我们发现报错如下:
image.png
原因是update和delete需要使用@Modifying注解申明,加上这个注解,继续测试,发现还是报错:
image.png
这个就很好理解了,delete和update操作需要开启事务,我们再加上@Transactional注解,测试就成功了。