欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

详解Spring Data JPA使用@Query注解(Using @Query)

程序员文章站 2023-11-05 16:00:22
经过几天的折腾,终于到了学习一个重量级的查询方式上,使用@query注解,使用注解有两种方式,一种是jpql的sql语言方式,一种是原生sql的语言,略有区别,后者我们更熟...

经过几天的折腾,终于到了学习一个重量级的查询方式上,使用@query注解,使用注解有两种方式,一种是jpql的sql语言方式,一种是原生sql的语言,略有区别,后者我们更熟悉一些。话不多说,看代码。

1、在customerrepository里添加

  /**
   * 模糊匹配
   * @param bauer
   * @return
   */
  @query("select c from customer c where c.firstname=?1")
  customer findbyfirstname2(string bauer);

  @query("select c from customer c where c.lastname=?1 order by c.id desc")
  list<customer> findbylastname2(string lastname);

  /**
   * 一个参数,匹配两个字段
   * @param name2
   * @return
   * 这里param的值和=:后面的参数匹配,但不需要和方法名对应的参数值对应
   */
  @query("select c from customer c where c.firstname=:name or c.lastname=:name order by c.id desc")
  list<customer> findbyname(@param("name") string name2);

  /**
   * 一个参数,匹配两个字段
   * @param name
   * @return
   * 这里的%只能放在占位的前面,后面不行
   */
  @query("select c from customer c where c.firstname like %?1")
  list<customer> findbyname2(@param("name") string name);

  /**
   * 一个参数,匹配两个字段
   * @param name
   * @return
   * 开启nativequery=true,在value里可以用原生sql语句完成查询
   */
  @query(nativequery = true,value = "select * from customer c where c.first_name like concat('%' ,?1,'%') ")
  list<customer> findbyname3(@param("name") string name);

2、在customercontroller内添加​

 
  /**
   * @query注解方式查询
   * 查询firstname为指定字符串
   */
  @requestmapping("/findbyfirstname2")
  public void findbyfirstname2(){
    customer customer = repository.findbyfirstname2("bauer");
    if(customer!=null){
      system.out.println(customer.tostring());
    }
    system.out.println("-------------------------------------------");
  }

  /**
   * @query注解方式查询
   * 查询lastname为指定字符串
   */
  @requestmapping("/findbylastname2")
  public void findbylastname2(){
    list<customer> result = repository.findbylastname2("bauer");
    for (customer customer:result){
      system.out.println(customer.tostring());
    }
    system.out.println("-------------------------------------------");
  }

  /**
   * @query注解方式查询,
   * 用@param指定参数,匹配firstname和lastname
   */
  @requestmapping("/findbyname")
  public void findbyname(){
    list<customer> result = repository.findbyname("bauer");
    for (customer customer:result){
      system.out.println(customer.tostring());
    }
    system.out.println("-------------------------------------------");
  }

  /**
   * @query注解方式查询,使用关键词like
   * 用@param指定参数,firstname的结尾为e的字符串
   */
  @requestmapping("/findbyname2")
  public void findbyname2(){
    list<customer> result = repository.findbyname2("e");
    for (customer customer:result){
      system.out.println(customer.tostring());
    }
    system.out.println("-------------------------------------------");
  }

  /**
   * @query注解方式查询,模糊匹配关键字e
   */
  @requestmapping("/findbyname3")
  public void findbyname3(){
    list<customer> result = repository.findbyname3("e");
    for (customer customer:result){
      system.out.println(customer.tostring());
    }
    system.out.println("-------------------------------------------");
  }

可能看了上面的代码有些疑惑,这里做一下解释:

?加数字表示占位符,?1代表在方法参数里的第一个参数,区别于其他的index,这里从1开始

=:加上变量名,这里是与方法参数中有@param的值匹配的,而不是与实际参数匹配的

jpql的语法中,表名的位置对应entity的名称,字段对应entity的属性,详细语法见相关文档

要使用原生sql需要在@query注解中设置nativequery=true,然后value变更为原生sql即可

参考:

官方文档,

demo,

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。