前言
在開發的時候,我們難免會遇到搜索,接下來讓我們來實現搜索功能的實現。
思路
- 首先在Repository類上不僅要繼承JpaRepository,還要繼承JpaSpecificationExecutor這個類實現條件查詢。
- 在service的findAll方法中中new一個Specification方法,實現裏面的toPredicate方法。
- 排序的我們可以使用page = new PageRequest(pages-1, rows, sort); sort是我們自己封裝的方法。
基本代碼
/***
*
* @param key 搜索關鍵詞
* @param pages 第幾頁
* @param rows 每頁幾條
* @param desc 按照升序還是降序排列
* @param sortBy 按照哪個字段排序
* @return
*/
@Override
public Page<Brand> findBrandSearch(String key, Integer pages, Integer rows,
boolean desc, String sortBy) {
ArrayList<String> strings = new ArrayList<>();
PageRequest page = null;
if (desc) {
if (sortBy.equals("id"))
strings.add("id");
if (sortBy.equals("letter"))
strings.add("letter");
Sort sort = new Sort(Sort.Direction.ASC, strings);
page = new PageRequest(pages-1, rows, sort);
}else
page = new PageRequest(pages-1,rows);
Page<Brand> list = brandRepository.findAll(new Specification<Brand>() {
@Override
public Predicate toPredicate(Root<Brand> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
ArrayList<Predicate> list = new ArrayList<>();
// if (key != "" && key != null) {
Predicate id = criteriaBuilder.like(root.get("id").as(String.class), key);
Predicate name = criteriaBuilder.like(root.get("name").as(String.class), "%" + key + "%");
Predicate letter = criteriaBuilder.like(root.get("letter").as(String.class), "%" + key + "%");
list.add(id);
list.add(name);
list.add(letter);
// }
Predicate[] array = new Predicate[list.size()];
Predicate[] predicates = list.toArray(array);
return criteriaBuilder.or(predicates);
}
}, page);
return list;
}
}
人生的遺憾莫過於,輕易的放棄了不該放棄的,固執地堅持了不該堅持的。