在上一篇中我们学习了如何使用Repository接口来查询,但是使用Repository接口来查询时,方法名会很长同时不利于我们写sql.
@Query注解查询适用于所查询的数据无法通过关键字查询得到结果的查询。这种查询可以摆脱像关键字查询那样的约束,将查询直接在相应的接口方法中声明,结构更为清晰,这是Spring Data的特有实现。
1.查询id最大的数据
/**
* 需要注意的是from后面跟的是与表名相对应的实体类名
* 同时返回值不能写*
* @return
*/
@Query("select a from Student a where a.id = (select max(id) from Student e)")
public Student getMaxId();
测试类:
@Test
public void testGetMaxId() {
Student s = studentRepositoryl.getMaxId();
System.out.println(s.toString());
}
控制台了打印:说明查询成功
2.根据name和age查询数据
@Query("select a from Student a where a.name = ?1 and a.age = ?2")
public Student getStudentByAgeAndName(String name, int age);
测试类:
@Test
public void testGetStudentByAgeAndName() {
Student s = studentRepositoryl.getStudentByAgeAndName("赵留", 17);
System.out.println(s.toString());
}
需要注意的是:?1是占位符,需要和方法中所传递的参数顺序一致。X是从1开始。
当然还支持命名参数(推荐使用此方式),如果
@Query("select a from Student a where a.name = :name and a.age = :age")
public Student getStudentByAgeAndName1(@Param("name") String name, @Param("age")int age);
如果冒号后面的值和我们定义的值相同。也就是上面说的name和age相同,那么也可以修改为
@Query("select a from Student a where a.name = :name and a.age = :age")
public Student getStudentByAgeAndName1(String name, int age);
3.模糊查询
同样模糊查询同样也支持两种传参方式
@Query("select a from Student a where a.name like %?1%")
public List<Student> queryLike(String name);
@Query("select a from Student a where a.name like %:name%")
public List<Student> queryLike1(String name);
4.使用原生SQL进行查询
在@query的是将原生查询置为false,我们只需要改为true,就可以使用原生sql查询
@Query(nativeQuery = true, value = "select count(1) from stu")
public int getCount();
测试类:
@Test
public void testGetCount() {
int count = studentRepositoryl.getCount();
System.out.println(count);
}
5.更新删除操作
在使用Query注解来更新和删除时,必须同时使用@Modifying注解和@Transactional注解
@Transactional
@Modifying
@Query("update Student set name = :name where id = :id")
public void update(String name, int id);
@Test
public void testUpdate() {
studentRepositoryl.update("测试", 1);
}
需要注意的是@query不支持insert操作