使用@Query 自定义查询
// 根据学生姓名查询学生记录 Student是实体类的名称
@Query("select s from Student s where s.name=?1")
List<Student> getStudentName(String name);
在controller中调用
/**
* 根据学生姓名查询学生记录 http://localhost:8080/getStuName?name=张三
*
* @param student * @return
*/
@RequestMapping("/getStuName")
public Object getStudentName(String name) {
List<Student> student=repository.getStudentName(name);
return student;
}
@Transactional 开启事务
@Modifying 识别执行更新操作
@Query() SQL语句
三个主注解缺一不可
// 通过学生id修改学生姓名 三个主注解缺一不可
@Transactional//开启事务
@Modifying//识别执行更新操作
@Query("update Student s set s.name=?1 where s.id=?2")
int updateStuById(String name, int id);
controller调用
/**
* 通过学生id修改学生姓名 http://localhost:8080/updateStuById?name=张3&id=1
*
* @param student * @return
*/
@RequestMapping("/updateStuById")
public Object updateStuById(String name,int id) {
int student=repository.updateStuById(name,id);
return student;
}
- 索引参数如下例代码所示,索引值从 1 开始,查询中 ”?X” 个数需要与方法定义的参数个数相一致,并且顺序也要一致:
@Transactional
@Modifying
@Query("update Student s set s.studentName=?1 where s.studentId=?2")
int setFixedStudentNameFor(String studentName,int studentId);
2)命名参数(推荐使用这种方式) 可以定义好参数名,赋值时采用@Param(“参数名”),而不用管顺序。
3) 在 StudentRepository 里添加如下代码,实现姓名的模糊查询:
@Query("select s from Student s where s.studentName like %:studentName% ")
List<Student> queryByname(@Param(value = "studentName") String studentName);
在 controller 里面进行调用,代码如下:
/***
* http://localhost:8080/queryByname?name=刘
* @param name * @return
*/
@RequestMapping("/queryByname")
public Object queryByname(String name) {
List<Student> student = repository.queryByname(name);
return student;
}
nativeQuery=true 开启原生SQL
//利用原生的 SQL 进行查询操作
@Query(value = "select s.* from studenttb s where s.student_name=?1", nativeQuery = true)
public List<Student> findStudentByName(String name);
//利用原生的 SQL 进行删除操作
@Query(value = "delete from studenttb where student_id=?1 ", nativeQuery = true)
@Modifying
@Transactional
public int deleteStudentById(int uid);
//利用原生的 SQL 进行修改操作
@Query(value = "update studenttb set student_name=?1 where student_id=?2 ", nativeQuery = true)
@Modifying
@Transactional
public int updateStudentName(String name,int id);
//利用原生的 SQL 进行插入操作
@Query(value = "insert into studenttb(student_name,student_age) value(?1,?2)", nativeQuery = true)
@Modifying
@Transactional
public int insertStudent(String name,int age);
//利用原生的 SQL 实现姓名的模糊查询
@Query(value=" SELECT * FROM studenttb WHERE STUDENT_NAME LIKE %:name% ",nativeQuery=true)
List<Student> queryBynameSQL(@Param(value = "name") String name);
controller调用
//原生 sql 的调用
/***
*查询学生
* http://localhost:8080/findStudentByName?name=刘一
* @param name * @return
*/
@RequestMapping("/findStudentByName")
public Object findStuByName(String name) {
List<Student> student = repository.findStudentByName(name);
return student;
}
/***
*删除学生
* http://localhost:8080/deleteStudentById?id=刘
* @param name * @return
*/
@RequestMapping("/deleteStudentById")
public Object deleteStudentById(int id) {
int i = repository.deleteStudentById(id);
Map<String,Object> map=new HashMap<String,Object>();
if(i>0) {
map.put("success", true);
}else {
map.put("success", false);
}
return map;
}
/***
* 修改学生名字
*http://localhost:8080/updateStudentName?name=Tom&id=1
* @param name * @return
*/
@RequestMapping("/updateStudentName")
public Object updateStudentName(String name,int id) {
int i = repository.updateStudentName(name,id);
Map<String,Object> map=new HashMap<String,Object>();
if(i>0) {
map.put("success", true);
}else {
map.put("success", false);
}
return map;
}
/***
*添加学生信息
* http://localhost:8080/insertStudent?name=xiao&age=18
129
* @param name * @return
*/
@RequestMapping("/insertStudent")
public Object insertStudent(String name,int age) {
int i = repository.insertStudent(name,age);
Map<String,Object> map=new HashMap<String,Object>();
if(i>0) {
map.put("success", true);
}else {
map.put("success", false);
}
return map;
}
/***
* 模糊查询
* http://localhost:8080/queryBynameSQL?name=刘
* @param name * @return
*/
@RequestMapping("/queryBynameSQL")
public Object queryBynameSQL(String name) {
List<Student> student= repository.queryBynameSQL(name);
return student;
}
JpaSpecificationExecutor 接口中的所有功能
- T findOne(Specification spec);// 查询单个对象
- List findAll(Specification spec);//查询列表
- Page findAll(Specification spec, Pageable pageable); //分页查询列表,pageable:分页参数。
- List findAll(Specification spec, Sort sort); //排序查询列表,Sort:排序参数
- long count(Specification spec);//统计查询
在上面的所有方法中,都有 Specification 对象,它是查询条件对象,需要自定义自己的 Specification 实现类,需要实现如下的方法:
Predicate toPredicate(Root root, CriteriaQuery> query, CriteriaBuilder cb);
controller 实现多条件查询
/**
* 多条件分页查询分页查询 http://localhost:8080/page/limit
*
* @param student * @return
*/
@RequestMapping("/page/limit")
public Object getPageLimit() {
Integer limit=10;
Integer index=1;
String name="张3";
PageRequest page=PageRequest.of(index-1, limit);
Specification<Student> spec=new Specification<Student>() {
@Override
public Predicate toPredicate(Root<Student> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
// TODO Auto-generated method stub
Predicate pc=criteriaBuilder.conjunction();
List<Expression<Boolean>> es=pc.getExpressions();
es.add(criteriaBuilder.like(root.get("name"), "%"+name+"%"));
return pc;
}
};
return repository.findAll(spec, page);
}
StudentRepository接口需要继承的
//接口 StudentRepository,并继承 JpaRepository 接口 JpaSpecificationExecutor接口
public interface StudentRepository extends JpaRepository<Student, Integer>,JpaSpecificationExecutor<Student>