最近学习了springboot项目,用到了对条件动态查询,做一些必要的笔记,一来是对自己学习的知识的巩固,二来对有同样问题的人有参考作用
一 原理简介
使用Spring Data JPA进行数据操作的时候一般有操作的复杂程度分为三个档次。
1、使用Spring Data JPA接口
。
JpaRepository
继承于PagingAndSortingRepository
,所以它传递性地拥有了以上接口的所有方法,同时,它还继承了另外一个QueryByExampleExecutor
接口,拥有了该接口匹配指定样例的能力,JpaRepository
接口定义如下。
package org.springframework.data.jpa.repository;
import java.io.Serializable;
import java.util.List;
import javax.persistence.EntityManager;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.Sort;
import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.QueryByExampleExecutor;
@NoRepositoryBean
public interface JpaRepository<T, ID extends Serializable>
extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
List<T> findAll(); // 查询所有实体
List<T> findAll(Sort sort); // 查询所有实体并排序
List<T> findAll(Iterable<ID> ids); // 根据ID集合查询实体
<S extends T> List<S> save(Iterable<S> entities); // 保存并返回(修改后的)实体集合
void flush(); // 提交事务
<S extends T> S saveAndFlush(S entity); // 保存实体并立即提交事务
void deleteInBatch(Iterable<T> entities); // 批量删除实体集合
void deleteAllInBatch();// 批量删除所有实体
T getOne(ID id); // 根据ID查询实体
@Override
<S extends T> List<S> findAll(Example<S> example); // 查询与指定Example匹配的所有实体
@Override
<S extends T> List<S> findAll(Example<S> example, Sort sort);// 查询与指定Example匹配的所有实体并排序
}
QueryByExampleExecutor
接口允许开发者根据给定的样例执行查询操作,接口定义如下。
package org.springframework.data.repository.query;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
public interface QueryByExampleExecutor<T> {
<S extends T> S findOne(Example<S> example); // 查询与指定Example匹配的唯一实体
<S extends T> Iterable<S> findAll(Example<S> example);