1. 程式人生 > >Spring-Data-JPA 用Specification進行動態SQL查詢

Spring-Data-JPA 用Specification進行動態SQL查詢

1.定義一個繼承JpaSpecificationExecutor的介面

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

這裡只是繼承介面中的方法:

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);

定義了常用的查詢單個物件,查詢資料集合,查詢分頁資料集合,查詢帶排序引數的資料集合,查詢資料的大小。

2.UserService.java增加如下方法程式碼

/**
     * 動態引數分頁,分頁查詢
     * @return
     */
public Page<User> find(final User user, Pageable pageable) {
return userDao.findAll(new Specification<User>() {


@Override
public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
List<Predicate> predicates = new ArrayList<Predicate>();
// 模糊查詢
if (StringUtils.isNotBlank(user.getName())) {
predicates.add(cb.like(root.get("name").as(String.class), "%" + user.getName() + "%"));
}
// gt大於查詢
if (user.getAge() != null) {
predicates.add(cb.gt(root.get("age").as(Integer.class), user.getAge()));

}

                       /*
* Create a conjunction of the given restriction predicates
* 建立給定限制predicates的連線。 cb.and()接收一個Predicates陣列,連線每一個查詢條件
* predicates.toArray(new
* Predicate[predicates.size()]):至於為什麼要這樣寫參考原始碼例子
*/
/* 考原始碼例子:
*  <pre>{@code String[] y = x.toArray(new String[0]); }</pre>
*
* Note that <tt>toArray(new Object[0])</tt> is identical in
* function to <tt>toArray()</tt>.
*/
return cb.and(predicates.toArray(new Predicate[predicates.size()]));
}
}, pageable);

}

3.測試程式碼

 @Test
public void test12() {
PageRequest pageRequest = new PageRequest(0, 100);
User param = new User();
param.setAge(20);
param.setName("李四");
Page<User> find = userService.find(param, pageRequest);
List<User> content = find.getContent();
for (User user : content) {
System.out.println(user);
}
}

                                                                               微信公眾號: 

                                               

                                                                             JAVA程式猿成長之路

                                                       分享學習資源,學習方法,記錄程式設計師生活。