1. 程式人生 > >快速學習Spring Data JPA -- 第六章JPA多條件查詢

快速學習Spring Data JPA -- 第六章JPA多條件查詢

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> {}

在以上的兩種實現方式中,沒有哪一個一定會優於另一個,所以我們不一定要全部掌握,掌握一種即可)。個人覺得第一個會難一些,規則太多,難記,這裡就不詳細闡述了。

本專案地址:https://git.coding.net/xlecho/SpringDataJpa.git