Spring Data JPA 多条件查询
2017-01-13 14:37
417 查看
Spring Data JPA 查询很方便,但做搜索功能时,条件都是未知的,并不能用方法命名的方式查询,自己写JPQL,用表达式的方式处理也不靠谱,条件多了简直就是作死,以前写过下面的代码:
正确解决办法是 JpaSpecificationExecutor 接口,这个接口中有5个方法
SELECT * FROM UserModel AS u WHERE u.sex = :sex AND u.age = :age 变化后 SELECT * FROM UserModel AS u WHERE (u.sex = :sex OR :sex == null) AND (u.age = :age OR :age == null)
正确解决办法是 JpaSpecificationExecutor 接口,这个接口中有5个方法
T findOne(Specification<T> spec); List<T> findAll(Specification<T> spec); Page<T> findAll(Specification<T> spec, Pageable pageable); List<T> findAll(Specification<T> spec, Sort sort); long count(Specification<T> spec);
Dao
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import com.github.ckwen.je.spring.boot.security.model.EmployeeModel; public interface EmployeeRepository extends JpaRepository<EmployeeModel, String>, JpaSpecificationExecutor<EmployeeModel> { }
Service
@Override public List<EmployeeModel> findSearch(EmployeeModel model) { Assert.notNull(model); List<EmployeeModel> result = employeeRepository.findAll(new Specification<EmployeeModel>() { @Override public Predicate toPredicate(Root<EmployeeModel> root, CriteriaQuery<?> query, CriteriaBuilder cb) { List<Predicate> list = new ArrayList<Predicate>(); if (StringUtils.isNoneBlank(model.getName())) { list.add(cb.like(root.get("name").as(String.class), "%" + model.getName() + "%")); } if (model.getGender() != null) { list.add(cb.equal(root.get("gender").as(GenderType.class), model.getGender())); } if (StringUtils.isNotBlank(model.getTelPhone())) { list.add(cb.like(root.get("telPhone").as(String.class), "%" + model.getTelPhone() + "%")); } if (model.getDepartment() != null && model.getDepartment().getCode() != null) { list.add(cb.equal(root.get("department").as(DepartmentModel.class), model.getDepartment())); } Predicate[] p = new Predicate[list.size()]; return cb.and(list.toArray(p)); } }); return result; }
Junit
@Autowired private EmployeeService employeeService; @Test public void test() { EmployeeModel model = new EmployeeModel(); model.setName("33"); model.setGender(GenderType.MALE); List<EmployeeModel> rs = employeeService.findSearch(model); for (EmployeeModel employeeModel : rs) { System.out.println(employeeModel); } } @Test public void test1() { EmployeeModel model = new EmployeeModel(); model.setDepartment(new DepartmentModel("AAA")); List<EmployeeModel> rs = employeeService.findSearch(model); for (EmployeeModel employeeModel : rs) { System.out.println(employeeModel); } }
相关文章推荐
- Spring Data JPA实现动态条件与范围查询实例代码
- Spring data jpa 多表查询(一:单表动态条件查询)
- Spring data jpa 多表查询(三:多对多关系动态条件查询)
- Spring Data JPA 复杂/多条件组合分页查询
- Spring MVC结合Spring Data JPA实现按条件查询和分页
- SpringData JPA 实现动态条件查询
- 【java】spring-data-jpa 集成hibernate实现多条件分页查询
- Spring Data JPA 复杂/多条件组合查询
- Spring Data Jpa-动态查询条件
- 【spring data jpa】带有条件的查询后分页和不带条件查询后分页实现
- SpringDataJpa -- 多条件查询
- Spring Data JPA 复杂/多条件组合查询
- spring data jpa 条件分页查询
- spring data jpa多条件查询
- spring data jpa的多条件查询
- spring-data-jpa 多条件查询 学习记录
- 【spring data jpa】带有条件的查询后分页和不带条件查询后分页实现
- 关于Spring data JPA 如何使用条件查询。
- Spring MVC和Spring Data JPA之按条件查询和分页(kkpaper分页组件)
- spring data jpa .基本使用,多条件复合查询,报表查询。