JPA中@query注解的复杂查询

写在最前面,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判断条件查询

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值