springboot jpa Predicate 的使用,实现多条件的复杂查询。

在springboot jpa中 我们可以使用Example.of(entity) 来进行条件的查询(这个之前已经介绍过了),但是这个方法不是太灵活,无法使条件灵活的变化。今天在看公司大佬写的代码时发现了一个特别实用的类,Predicate 。下面介绍一下他的用法,因为本人也在学习过程当中,这篇文章会做一定的改善。

1 我们首先定义一个接口继承PagingAndSortingRepository 和JpaSpecificationExecutor ,在实验的过程中如果不继承PagingAndSortingRepository ,spring容器就不会创造这个接口代理类对象,具体是为什么我也没有搞清楚。准备工作做好,上代码

Pageable pageable = PageRequest.of(0, 1);
		User user = new User();
		user.setId("4");
		user.setLoginTime("fs");
		user.setStatus("0");
		user.setToken("d");
		List<User> users = jpaDemo.findAll(new Specification<User>() {
			private static final long serialVersionUID = 1L;

			@Override
			public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
				// TODO Auto-generated method stub
				Predicate onePredicate = criteriaBuilder.equal(root.get("id"), user.getId());
				Predicate towPredicate = criteriaBuilder.equal(root.get("status"), user.getStatus());
				Predicate threePredicate = criteriaBuilder.or(onePredicate, towPredicate);//这个是让这两个条件进行or的连接。
				
				Predicate fiPredicate = criteriaBuilder.like(root.get("loginTime"), user.getLoginTime());
				return criteriaBuilder.and(threePredicate, forwPredicate,fiPredicate);; //进行and连接

			}
		});
这个会产生如下的sql
Hibernate: 
select user0_.id as id1_3_, user0_.login_time as login_ti2_3_, 
user0_.status as status3_3_, user0_.token as token4_3_, 
user0_.user_account as user_acc5_3_ from user user0_ where 
(user0_.id=? or user0_.status=?) and user0_.token=? and (user0_.login_time like ?)




还有一个重要的关键点
如果你的实体类有主外键的关系的话 ,你可以根据外键的关系,获取导另一个对象的属性,聚个例子:

class  Cart {  购物车类 实体类有主外键的关系
    private String cartId
    private  String name;
    private Product  product;//这个是货品信息
}

class Product{
   private String productid
    private  String name;

}
此时这个方法可以这样写
criteriaBuilder.equal(root.get("product").get("productid:),      这里是你的条件对象)






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值