簡介
習(xí)慣了使用mybtais操作數(shù)據(jù)庫畜挨。今天,嘗試了下jpa的操作噩凹,但是遇到個問題巴元,jpa的條件查詢和分頁查詢該如何使用呢。不要慌驮宴,老司機帶你靈活使用jpa的高級玩法逮刨,廢話不多說,直接上代碼最干脆堵泽,也是最方便的辦法修己。
- 1、DAO層繼承JpaSpecificationExecutor接口(當(dāng)然迎罗,如果需要JpaRepository相關(guān)方法睬愤,同時繼承即可)
繼承JpaSpecificationExecutor類接口,
public interface AdminAccountRepository extends JpaRepository<AdminAccount, String>,JpaSpecificationExecutor {
}
通過查看源碼我們發(fā)現(xiàn):
public interface JpaSpecificationExecutor<T> {
T findOne(Specification<T> var1);
List<T> findAll(Specification<T> var1);
Page<T> findAll(Specification<T> var1, Pageable var2);
List<T> findAll(Specification<T> var1, Sort var2);
long count(Specification<T> var1);
}
有沒有啥發(fā)現(xiàn)纹安,不用我多說了吧尤辱。
- 2砂豌、Service構(gòu)造查詢條件,并調(diào)用DAO層:
public Page<AdminAccount> findAdmin(String username, String password) {
Pageable pageable = new PageRequest(1, 2, Sort.Direction.ASC, "id");
Specification<AdminAccount> specification = new Specification<AdminAccount>() {
@Override
public Predicate toPredicate(Root<AdminAccount> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder cb) {
List<Predicate> list = new ArrayList<Predicate>();
if (!StringUtils.isEmpty(username)) {
list.add(cb.like(root.get("username").as(String.class), "%" + username + "%"));
}
if (!StringUtils.isEmpty(password)) {
list.add(cb.equal(root.get("password").as(String.class), password));
}
return cb.and(list.toArray(new Predicate[list.size()]));
}
};
Page<AdminAccount> adminAccounts = adminRepository.findAll(specification, pageable);
return adminAccounts;
}
通過以上兩個步驟光督,就可以簡單的實現(xiàn)分頁和條件查詢阳距。是不是很簡單。至于更深度的代碼需要讀者們自己去探索结借。