Spring data jpa的高级查询的应用和底层原理分析

本文深入探讨Spring Data JPA的高级查询,包括固定参数、不定参数个数和高级组合查询的实现方式,并分析Spring在不同场景下的底层实现。通过方法拦截器,Spring Data JPA在启动时收集所有查询方法,并在运行时动态生成执行器。此外,文章还介绍了如何通过Specification和ExampleSpecification进行自定义查询,帮助开发者更好地理解和运用这一强大功能。
摘要由CSDN通过智能技术生成

spring data jpa的查询

目前比较简单的查询:

三种查询方案的写法

  1. 固定参数查询
interface XxxRepo implements JpaRepository<T,Long>{
    
	EntityXxx findByNameAndSex(String name,String sex);
}

这种方式是简单的,方法名表达自己想查询的方法。支持and, or ,like, top, betweent,order等等。

  1. 不定参数个数查询
PageRequest pageable = new PageRequest(query.getPindex(), query.getPcount(), query.getSortObj());//分页
Example<EntityXXX> example = Example.of(entity, ExampleMatcher.matchingAll());//封装对象,matchingAll表明满足所有条件
Page<EntityXXX> findAll = entityRepo.findAll(example, pageable);//开始查找并返回对象

像以上这种代码,是可以多条件and查询的。比如name=abc and sex=male。这种组合满足我们一般的需求。

但是如果,我们想要查找name in (zhangsan,lisi,wanger,mazi)等,那么这种方式就不再适用。我们可以采用高级一点的查询。

  1. 高级组合查询:
public Page<EntityXxx> findAll(EntityXxx entity, PageRequest pageable) {
    
	Specification<EntityXxx> condition = whereCondition(entity);
	Page<EntityXxx> page = entityRepo.findAll(condition, pageable);
	return page;
}


private Specification<EntityXxx> whereCondition(EntityXxx entity) {
    
	return new Specification<EntityXxx>() {
    
		@Override
		public Predicate toPredicate(Root<EntityXxx> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
    
			List<Predicate> predicates = new ArrayList<Predicate>();
			
			List<String> names = new ArrayList<>();
			names.add("zhangsan");
			names.add("lisi");
			names.add("wanger");
			Expression<Long> parentExpression = root.get("name");
			Predicate parentPredicate = parentExpression.in(names);
			predicates.add(parentPredicate);

			if (!StringUtils.isEmpty(entity.getSex())) {
    
				predicates.add(cb.like(root.<String>get("sex"), "%" + entity.getSex() + "%"));//like查询
			}
			if (null != entity.getIdnum()) {
    
				predicates.add(cb.equal(root.<Integer>get("innum"), entity.getIdnum()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值