JPA多条件查询AND和OR和IN混合查询(公司项目实战应用JPA)

以下列方法为例,结合公司实际业务需求,演示jpa动态拼接sql,满足业务需求

/*
	FlightPlanDetailRequest 是请求体,可以把它当作一个对象
	PageRequest 是分页对象,可以用JPA自带的,这里我使用的是自己封装的
	flightPlanSerialList 是用来存储你要查询的flightPlanSerial集合
*/
@Autowired
private IFlightPlanDetailRepository detailRepository;

@Override
public GetFlightDetailResponse searchFlightPlanDetail(FlightPlanDetailRequest requset, PageRequest page){
	if(StringUtils.isEmpty(request.getFlightPlanDetail())){
		return "传递参数有误";//这里简写,实际应该用你们公司封装的错误返回对象,这里只表述jpa多条件查询相关,不多涉及业务
	}
	List<Integer> flightPlanSerialList = new ArrayList<>();//此处的值可以查询得出
	List<FlightPlanDetail> listDetail = detailRepository.findByFlightPlanSerial(request.getFlightPlanDetail());
	for(int i = 0; i < listDetail.size(); i++){
		flightPlanSerialList .add(listDetail.get(i).getFlightPlanDetail());
	}
	Sepcification<FlightPlanDetail> spec = new Specification<FlightPlanDetail>(){
		@Override
		public Predicate toPredicate(Root<FlightPlanDetail> root, CriteriaQuery<?> cq, CriteriaBuilder cb){
			List<Predicate> listOr = new ArrayList<>();
			List<Predicate> listAnd = new ArrayList<>();
			Expression<Integer> flightPlanSerial = root.<Integer>get("flightPlanSerial");
			Path contactName = root.get("contactName");
			Path deleteState= root.get("deleteState");
			if(!StringUtils.isEmpty(request.getContactName())){
				listOr.add(cb.like(contactName,"%"+request.getContactName()+"%"));
			}
			//这里要对集合判空,当然判断条件也可以用flightPlanSerialList.size() > 0,防止in()括号中没有值
			if(!flightPlanSerialList.isEmpty()){
				listAnd.add(flightPlanSerial.in(flightPlanSerialList ))
			}
			listAnd.add(cb.equal(deleteState,1));//此步是过滤逻辑删除
			Predicate preOr = cb.or(listOr.toArray(new Predicate[listOr.size()]));//or条件
			Predicate preAnd = cb.and(listAnd.toArray(new Predicate[listAnd.size()]));//and条件
			return cq.where(preOr,preAnd).getRestriction();
		}
		
	};

	//Page<FlightPlanDetail> pageResult = detailRepository.findAll(spec, page);//也可以不用分页
	//这样含有and or以及in的动态sql就生成了,当然也可以在Repository接口中定义动态sql,不过我个人倾向于业务动态拼接,这样扩展性较好
	List<FlightPlanDetail> list = detailRepository.findAll(spec); 
	//.....此处省略封装返回值对象,简写为list返回
	return list;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慕木兮人可

感谢支持,勿忘初心

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值