快速學習Spring Data JPA -- 第六章JPA多條件查詢
阿新 • • 發佈:2018-11-01
xl_echo編輯整理,交流學習請加1280023003 百戰不敗,依不自稱常勝,百敗不頹,依能奮力前行。——這才是真正的堪稱強大!!
在Springle Data JPA中,我們看到了JPA由於不需要寫SQL給我們簡化了很多的工作。同時JPA的特性,讓我們對資料層面的操作更加簡化,更加的方便。但是同時他也給我們帶來了不靈便和部分效能問題。那麼從我們之前的文章中可以看到,JPA提供了相對靈活的方式,他可以支援原生SQL,所以部分的解決了這個問題。但是真實開發中我們設計的業務可能會更加複雜,僅僅使用原生的SQL已經不能滿足需求,比如多條件查詢中,某個條件為空,可能導致結果出錯或者查詢到全部的資料。那麼針對這類問題,JPA有自己的解決方法。多條件自定義查詢。
先來看一段條件查詢程式碼示例:
/**
* author:XLecho
* Date:2018/10/25 0025
* Time:19:12
*/
@RestController
@RequestMapping(path = "/demo")
public class UserController {
@Autowired
private UserRepositoryExtendsJpaSpecificationExecutor userRepositoryExtendsJpaSpecificationExecutor;
private EntityManager em;
@RequestMapping(value = "/criteria/query", method = RequestMethod.GET)
public void getCriteria(){
//創造一些假的查詢資料
User user = new User();
user.setId(1L);
user.setName("A");
user.setEmail("aaa");
List<User> all = userRepositoryExtendsJpaSpecificationExecutor. findAll(new Specification<User>() {
@Override
public Predicate toPredicate(Root<User> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
List<Predicate> list = new ArrayList<Predicate>();
if (user.getEmail() != null && user.getEmail().length() != 0){
list.add(criteriaBuilder.equal(root.get("email").as(String.class), user.getEmail()));
}
if(user.getId() != null && user.getId() != 0){
list.add(criteriaBuilder.equal(root.get("id").as(Integer.class), user.getId()));
}
Predicate[] p = new Predicate[list.size()];
return criteriaBuilder.and(list.toArray(p));
}
});
System.out.println(all);
}
}
從程式碼中我們可以明顯的看到,我們設定了兩個條件,一個是user的email,一個是user的id。雖然我們傳入了name,但是我們沒有加入進條件。這也是多條件靈活的一個表現。這裡我們可以加入某些條件,而某些條件不加入。
注意:JPA多條件查詢的實現方式有很多種。比如:
QueryByExampleExecutor
JpaSpecificationExecutor
本章用的就是JpaSpecifiication,需要使用直接在Repository上繼承即可。
public interface UserRepositoryExtendsJpaSpecificationExecutor extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {}
在以上的兩種實現方式中,沒有哪一個一定會優於另一個,所以我們不一定要全部掌握,掌握一種即可)。個人覺得第一個會難一些,規則太多,難記,這裡就不詳細闡述了。