这里,spring data jpa为我们提供了JpaSpecificationExecutor接口,只要简单实现toPredicate方法就可以实现复杂的查询
@Repository public interface MonitorRepository extends JpaRepository<Monitor, Long>, JpaSpecificationExecutor { }
ctrl类
@GetMapping("/api/listPage") @ResponseBody public Map<String, Object> listPage(@RequestParam(value = "pageNumber", defaultValue = "1") Integer pageNumber, @RequestParam(value = "pageSize", defaultValue = "100") Integer pageSize, @RequestParam("searchName") String searchName, @RequestParam("searchUrl") String searchUrl) { //Pageable默认从0开始 pageNumber = pageNumber <= 0 ? 0 : pageNumber - 1; Pageable pageable = new PageRequest(pageNumber, pageSize); // Page<Monitor> monitorList = monitorRepository.findMonitorByNameOrUrl(pageable, searchName, urlPath); Specification specification = new Specification() { @Override public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder cb) { List<Predicate> predicates = new ArrayList<>(); if (StringUtils.isNotBlank(searchName)) { predicates.add(cb.like(root.get("name"), "%" + searchName + "%")); } if (StringUtils.isNotBlank(searchUrl)) { predicates.add(cb.like(root.get("url"), "%" + searchUrl + "%")); } return cb.and(predicates.toArray(new Predicate[predicates.size()])); } }; Page<Monitor> monitorList = monitorRepository.findAll(specification, pageable); Map<String, Object> result = new HashMap<>(); result.put("total", monitorList.getTotalElements()); result.put("rows", monitorList.getContent()); return result; }
bean类
import com.fasterxml.jackson.annotation.JsonFormat;
import org.hibernate.annotations.CreationTimestamp;
import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;
@Entity
@Table(name = "monitor")
public class Monitor implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "m_id", length = 11)
private Long id;
@Column(name = "m_name", length = 64)
private String name;
@Column(name = "m_group", length = 64)
private String group;
@Column(name = "m_url", length = 200)
private String url;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "create_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+08:00")
@CreationTimestamp
private Date createTime;
}