Spring Data JPA中使用Example進行動態查詢


  Spring Data JPA中使用Example進行動態查詢主要涉及:實體對象、ExampleMatcher和Example等三種類類型。基於實例的動態查詢所包含的三要素如下:
1、實體對象:在ORM框架中與Table對應的域對象,一個對象代表數據庫表中的一條記錄,如上例中User對象,對應user表。在構建查詢條件時,一個實體對象代表的是查詢條件中的“數值”部分。如:要查詢姓“X”的客戶,實體對象只需要存儲條件值“X”。

2、匹配器:ExampleMatcher對象,它是匹配“實體對象”的,表示了如何使用“實體對象”中的“值”進行查詢,它代表的是“查詢方式”,解釋了如何去查的問題。如:要查詢姓“X”的客戶,即姓名以“X”開頭的客戶,該對象就表示了“以某某開頭的”這個查詢方式,如上例中:withMatcher(“userName”, GenericPropertyMatchers.startsWith())

3、實例:即Example對象,代表的是完整的查詢條件。由實體對象(查詢條件值)和匹配器(查詢方式)共同創建。最終根據實例來findAll即可。

    /**
     * 查詢失物招領信息
     * @return
     */
    @GetMapping("/lost/list")
    public ApiReturnObject findAllLostProperty (String materialName,Timestamp registerTime,String status) {
        LostProperty obj=new LostProperty();
        obj.setMaterialName(materialName);
        obj.setRegisterTime(registerTime);
        obj.setStatus(status);
        //創建匹配器,即如何使用查詢條件
        ExampleMatcher matcher = ExampleMatcher.matching() //構建對象
                .withMatcher("materialName", GenericPropertyMatchers.contains()) //姓名采用“開始匹配”的方式查詢
                .withMatcher("registerTime", GenericPropertyMatchers.contains()) //姓名采用“開始匹配”的方式查詢
                .withMatcher("status", GenericPropertyMatchers.contains()) //姓名采用“開始匹配”的方式查詢
                .withIgnorePaths("id");  //忽略屬性:是否關注。因為是基本類型,需要忽略掉

        //創建實例
        Example<LostProperty> ex = Example.of(obj, matcher); 
        //查詢
        List<LostProperty> ls = lostPropertyRespository.findAll(ex);

        return ApiReturnUtil.success(ls);
    }

查詢狀態為0的全部:

 

查詢狀態為0,且名字為手機的:

 

Matching生成的語句說明
DEFAULT (case-sensitive) firstname = ?0 默認(大小寫敏感)
DEFAULT (case-insensitive) LOWER(firstname) = LOWER(?0) 默認(忽略大小寫)
EXACT (case-sensitive) firstname = ?0 精確匹配(大小寫敏感)
EXACT (case-insensitive) LOWER(firstname) = LOWER(?0) 精確匹配(忽略大小寫)
STARTING (case-sensitive) firstname like ?0 + ‘%’ 前綴匹配(大小寫敏感)
STARTING (case-insensitive) LOWER(firstname) like LOWER(?0) + ‘%’ 前綴匹配(忽略大小寫)
ENDING (case-sensitive) firstname like ‘%’ + ?0 后綴匹配(大小寫敏感)
ENDING (case-insensitive) LOWER(firstname) like ‘%’ + LOWER(?0) 后綴匹配(忽略大小寫)
CONTAINING (case-sensitive) firstname like ‘%’ + ?0 + ‘%’ 模糊查詢(大小寫敏感)
CONTAINING (case-insensitive) LOWER(firstname) like ‘%’ + LOWER(?0) + ‘%’ 模糊查詢(忽略大小寫)


后話:
使用一段時間之后,發現ExampleMatcher對日期的查詢很不友好,不支持動態查詢的,所以有了接下來研究的Specification復雜查詢,可以了解一下。

SpringDataJpa之Specification復雜查詢

SpringDataJpa之Pageable+ExampleMatcher進行分頁多條件查詢


————————————————
版權聲明:本文為CSDN博主「Moshow鄭鍇」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/moshowgame/article/details/80282813


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM