经过几天的折腾,终于到了学习一个重量级的查询方式上,使用@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 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 findbyname(@param("name") string name2);
/**
* 一个参数,匹配两个字段
* @param name
* @return
* 这里的%只能放在占位的前面,后面不行
*/
@query("select c from customer c where c.firstname like %?1")
list 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 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 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 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 result = repository.findbyname2("e");
for (customer customer:result){
system.out.println(customer.tostring());
}
system.out.println("-------------------------------------------");
}
/**
* @query注解方式查询,模糊匹配关键字e
*/
@requestmapping("/findbyname3")
public void findbyname3(){
list 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,
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持萬仟网。
希望与广大网友互动??
点此进行留言吧!