SpringDataJpa自定义查询语句(JPQL)

SpringDataJpa自定义查询语句(JPQL)


前言

前面讲了SpringDataJpa持久层操作,请查看博主的SpringDataJpa系列文章。欢迎关注!


自定义查询语句(JPQL)

这种查询可以声明在Repository方法中,摆脱像命名查询那样的约束,将查询直接在相应的接口方法中声明,结构更清晰,这是SpringDataJpa的特有实现

使用@Query自定义查询

  • 前面介绍的获取数据的方式都没有使用到任何的HQL(Hibernate Query Language)语句,那些方法已经可以满足
    很多需求,也有时候会觉得方法名太长不太方便,下面介绍一下使用Hql方式获取数据。

例如根据具体名字查询学生信息,在StudentRepository类中添加如下方法:

@Query("select s from Student s where s.studentName = ?1") 
Student findByStudentName(String studentName);

在Controller调用,如下

/*** 
* http://localhost:8090/findStudentsByName?name=刘三 
* @param name 
* @return */ 
@RequestMapping("/findStudentsByName") 
public Object findStudentBystudentName(String name) {
    Student student = repository.findByStudentName(name);
    return student; 
}

@Query与 @Modifying的联合使用

这两个annotation一起声明,可定义个性化更新操作,例如只涉及某些字段更新时最为常用,示例如下:

  • a.如果要修改学生姓名,首先在StudentRepository下添加如下代码:
@Transactional 
@Modifying 
@Query("update Student s set s.studentName=?1 where s.studentId=?2") 
int setFixedStudentNameFor(String studentName,int studentId);
  • b.在StudentController里面进行调用,代码如下:
/*** 
* http://localhost:8090/setStudent?name=lucy&id=2 
* @param name 
* @return */ 
@RequestMapping("/setStudent") 
public Object setStudentByName(String name,int id) { 
    int i = repository.setFixedStudentNameFor(name,id); 
    Map map=new HashMap(); 
    if(i>0) { 
        map.put("success", true); 
    }else {
        map.put("success", false); }return map; 
    }
}

索引参数与命名参数

  1. 索引参数如下例代码所示,索引值从1开始,查询中 ”?X” 个数需要与方法定义的参数个数相一致,并且顺序也
    要一致
@Transactional 
@Modifying 
@Query("update Student s set s.studentName=?1 where s.studentId=?2") 
int setFixedStudentNameFor(String studentName,int studentId);
  1. 命名参数(推荐使用这种方式)  可以定义好参数名,赋值时采用@Param(“参数名”),而不用管顺序。如下所
    示:
    • a.在StudentRepository里添加如下代码:
@Query("select s from Student s where s.studentName like %:studentName% ") 
List queryByname(@Param(value = "studentName") String studentName);
- b.在StudentController里面进行调用,代码如下:
/*** 
* http://localhost:8090/queryByname?name=刘 
* @param name 
* @return */ 
@RequestMapping("/queryByname") 
public Object queryByname(String name) { 
    List student = repository.queryByname(name); 
    return student; 
}

好了到这里也该结束了,下一篇讲解–SpringDataJpa的原生Sql查询,各位要自己多动手才能学到真正的东西。加油各位


最后

  • 更多参考精彩博文请看这里:《陈永佳的博客》

  • 喜欢博主的小伙伴可以加个关注、点个赞哦,持续更新嘿嘿!


你可能感兴趣的:(SpringDataJpa系列,为霞而作)