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

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()
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Data JPA 中,我们可以通过定义 Repository 接口中的方法,使用方法名来自动生成查询语句。但是有时候,我们需要自定义查询结果,比如说只需要查询结果中的部分字段,或者对查询结果进行聚合操作等。这时,我们可以使用 Spring Data JPA 提供的投影(Projection)功能来自定义查询结果。 投影是指将实体类中的一部分属性或关联属性映射成一个接口或类,从而返回一个自定义的结果集。Spring Data JPA 支持三种投影方式: 1. 接口投影:定义一个接口,接口中声明需要的属性,Spring Data JPA 将根据接口定义的属性生成查询结果。 2. 类投影:定义一个类,类中声明需要的属性,Spring Data JPA 将根据类定义的属性生成查询结果。 3. 动态投影:可以根据查询条件动态地返回不同的投影结果,比如说根据用户的角色返回不同的查询结果。 下面是一个简单的例子,演示如何使用接口投影来自定义查询结果: 定义一个接口投影: ```java public interface UserProjection { String getUsername(); String getEmail(); } ``` 在 UserRepository 中使用接口投影: ```java public interface UserRepository extends JpaRepository<User, Long> { List<UserProjection> findByUsername(String username); } ``` 通过上面的代码,我们可以在 UserRepository 中定义一个方法 findByUsername,该方法会返回一个 List<UserProjection> 类型的结果集,该结果集中只包含 username 和 email 两个字段。 当我们调用 findByUsername 方法时,Spring Data JPA 将根据方法名自动生成查询语句,并根据 UserProjection 接口中定义的属性生成查询结果。 当然,除了接口投影,还有其他的投影方式,你可以根据自己的需求选择适合的方式。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值