写在最前面,JPA中自带的查询构造
关键字 方法命名 sql where字句
And findByNameAndPwd where name= ? and pwd =?
Or findByNameOrSex where name= ? or sex=?
Is,Equals findById,findByIdEquals where id= ?
Between findByIdBetween where id between ? and ?
LessThan findByIdLessThan where id < ?
LessThanEquals findByIdLessThanEquals where id <= ?
GreaterThan findByIdGreaterThan where id > ?
GreaterThanEquals findByIdGreaterThanEquals where id > = ?
After findByIdAfter where id > ?
Before findByIdBefore where id < ?
IsNull findByNameIsNull where name is null
isNotNull,NotNull findByNameNotNull where name is not null
Like findByNameLike where name like ?
NotLike findByNameNotLike where name not like ?
StartingWith findByNameStartingWith where name like ‘?%’
EndingWith findByNameEndingWith where name like ‘%?’
Containing findByNameContaining where name like ‘%?%’
OrderBy findByIdOrderByXDesc where id=? order by x desc
Not findByNameNot where name <> ?
In findByIdIn(Collection<?> c) where id in (?)
NotIn findByIdNotIn(Collection<?> c) where id not in (?)
True findByAaaTue where aaa = true
False findByAaaFalse where aaa = false
IgnoreCase findByNameIgnoreCase where UPPER(name)=UPPER(?)
JPA@query
不过到了面试的时候,你JPA或者MybatisPlas用的再熟练,面试官只会问你sql。
对于再Jpa中使用查询语句的方法是我们必须要掌握的
一般来说我们对于中间层会封装一个findAll的方法
@Override
@Transactional(readOnly = true)
@Query("select e from #{#entityName} e where e.deleted = false")
List<T> findAll();
参照使用的注解
@Transactional
使用此注解来管理事务,要么都成功,要么都失败
@Query
使用此注解并且与注解中的属性nativeQuery = true,连用,表示这不是一个JPA自带的sql映射语句,是我们自己写的
下面直接上代码
@Query(value = "select u.* from User u where q.name =?1",nativeQuery = true)
User findOneByName(String name);
表示对于填充属性1到 ?1 的地方
一定要使用英文的? !!!! 别问为什么
那么如果说我们要进行一个复合查询,两张表关联,然后要求其中的字符如果为空,那么就不走这个查询怎么办?
@Query(value = "select * from people where if(?1 !='',name like concat('%',?1,'%'),1=1) and if(?2 !='',sex=?2,1=1)"+
" and if(IFNULL(?3,'') !='',age=?3,1=1) and if(IFNULL(?4,'') !='',num=?4,1=1) ",nativeQuery = true)
List<People> find(String name,String sex,Integer age,Integer num);
以上这个例子是copy的,我自己懒得写(狗头)
我们把这个简单的整理出几条sql语句然后一条一条进行解析
@Query(nativeQuery = true,vale = "select * from people if(?1 !='',name like concat('%',?1,'%'),1=1)")
List<People> find(String name);
这一条sql语句表示,如果说咱们的name要进行模糊查询,但是前端又可以传一个空值进来(事真多啊!)
那么就可以使用if判断语句:如下
if(条件,为是,执行这,为否,执行这)
说白了,三元运算符
@Query(nativeQuery = true,vale = "select * from people where if (?1 !='',sex=?1,1=1)")
List<People> find(String sex);
就是查一下性别这个字段是否等于1
@Query(nativeQuery = true,vale = "select * from people where if(IFNULL(?1,'') !='',age=?1,1=1)")
List<People> find(Integer age);
这个就是一个是三元运算符,套了一个判断函数
IFNULL(?1,'')
在sql里面没有null这个概念,所有的null都是'',
表示空字符串,那么如果?1是一个空,那么这个函数
就会把这个对象转换为 ''
其他博主的解释:
IFNULL 是mysql中的一个函数,这个函数一般用
来替换 NULL 值的。IFNULL(value1,value2),
判断value1是否为null,如果为null则用value2替换
所以对于时间格式的我们也是这么判断的,不过还要用到Date函数
@Query(nativeQuery = true,vale = "select * from people where if(IFNULL(?1, '') != '' , DATE(m.create_time) < DATE(?1) , 1 = 1 )")
List<People> find(Date endDate);
用Date函数套起来,表示这是一个date对象,开整
JPA@Query分页
接下来介绍一下@query如何实现分页
/**
* 分页查询功能
*/
@Query("select t.id, t.taskName, t.subTaskName, t.createDate, t.endDate, t.errorMsg, "
+ "t.publishStatus, t.taskStage from TaskInfo t where t.delete=false and t.userId=?1")
List<TaskInfo> getTaskListByPage(Integer userId, Pageable pageable);
serviceImpl层的实现
public JSONObject search(int userId, int page, int size) {
//下面这个方法我使用的时候构造出错了,但是看构造器,确实没毛病奥,但是报错了,烦死,注掉
//Sort sort = new Sort(Sort.Direction.DESC, "taskId");
// 分页查询,这里使用另一个重载方法
//Pageable pageable = PageRequest.of(page, size, sort);
Pageable pageable = PageRequest.of(page, size);
List<TaskInfo> taskInfoList = taskInfoRepo.getTaskListByPage(userId, pageable);
json.put("list", taskInfoList);
json.put("result", true);
return json;
}
参考教程
以上就是全部内容了,特别感谢一下以上这几个作者,csdn关于Jpa的教程太少了
链接: 使用jpa的注解@Query 进行分页查询
链接: SpringBoot | JPA基本查询及多条件查询,参数为空判断
链接: jpa中使用Query判断条件查询