Spring Data JPA 多条件查询

Spring Data JPA 查询很方便,但做搜索功能时,条件都是未知的,并不能用方法命名的方式查询,自己写JPQL,用表达式的方式处理也不靠谱,条件多了简直就是作死,以前写过下面的代码:

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);
    }
}
  • 0
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值