欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring Data JPA动态查询

程序员文章站 2022-04-25 16:30:05
...

默认的 JPA 可以做简单的查询,当我们遇到多条件时怎么动态的来查询数据,这里使用 Specification 来解决这个问题

一、使用

Dao 接口需要继承 JpaRepository 之外,还需要继承 JpaSpecificationExecutor

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;

import com.ustcinfo.thinkcloud.common.entity.rbac.User;

public interface UserRepo extends JpaRepository<User, Integer>, JpaSpecificationExecutor<User> {
}

实现多条件的查询:

import java.util.ArrayList;
import java.util.List;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;

import com.ustcinfo.thinkcloud.common.entity.rbac.User;
import com.ustcinfo.thinkcloud.common.repository.rbac.UserRepo;

@Service
public class UserService {

	@Autowired
	private UserRepo userRepo;

	/**
	 * JPA动态查询
	 */
	public List<User> find(User user) {

		// Specification查询构造器
		Specification<User> specification = new Specification<User>() {

			private static final long serialVersionUID = 1L;

			@Override
			public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
				List<Predicate> predicates = new ArrayList<>();
				// 添加搜索条件
				if (null != user.getId()) {
					predicates.add(criteriaBuilder.equal(root.get("id"), user.getId())); // id是表字段
				}
				if (StringUtils.isNotBlank(user.getName())) {
					predicates.add(criteriaBuilder.like(root.get("name"), user.getName()));
				}
				// 把搜索条件连接(AND)起来
				return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
			}
		};
		return userRepo.findAll(specification);
	}

}