最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringJPA?做分頁條件查詢的代碼實踐

 更新時間:2024年03月28日 10:52:56   作者:大魔王的日常Log  
相信小伙伴們的項目很多都用到SpringJPA框架的吧,對于單表的增刪改查利用jpa是很方便的,但是對于條件查詢并且分頁?是不是很多小伙伴不經(jīng)常寫到,今天給大家分享SpringJPA?做分頁條件查詢的案例代碼,感興趣的朋友一起看看吧

前言:

相信小伙伴們的項目很多都用到SpringJPA框架的吧,對于單表的增刪改查利用jpa是很方便的,但是對于條件查詢并且分頁 是不是很多小伙伴不經(jīng)常寫到. 今天我整理了一下在這里分享一下.
話不多說直接上代碼:

Controller:

@RestController
public class ProductInstanceController {
    @Autowired
    private ProductInstanceService productInstanceService;
    @PostMapping("page-find-instance")
    public PageInfoVO<ProductInst> pageFindInstance(@RequestBody ProductInstParams productInstParams) {
        return productInstanceService.pageFindInstance(productInstParams);
    }
}

Service:

@Service
public class ProductInstanceService {
    @Autowired
    private ProductInstRepository productInstRepository;
    public PageInfoVO<ProductInst> pageFindInstance(ProductInstParams productInstParams) {
        Sort.Direction direction = Sort.Direction.DESC;
        //創(chuàng)建一個Pageable對象,其中包含了請求的頁碼(productInstParams.getPageNo()),每頁大小(productInstParams.getPageSize()),排序規(guī)則以及排序字段名。
        Pageable pageable = PageRequest.of(productInstParams.getPageNo(), productInstParams.getPageSize(), direction, "createdTime");
		//將傳入的字符串類型的開始日期(startDate)和結(jié)束日期(endDate)轉(zhuǎn)換成Date類型
        Date start = DateUtil.parseUTC(productInstParams.getStartDate());
        Date end = DateUtil.parseUTC(productInstParams.getEndDate());
        //執(zhí)行JPA分頁查詢:
        Page<ProductInst> productInstPage = productInstRepository.findAll((root, query, criteriaBuilder) -> {
        //初始化一個ArrayList<Predicate>,存儲多個謂詞條件,這些條件最終會被組合成一個邏輯與(AND)表達式
            List<Predicate> predicatesAndList = new ArrayList<>();
            // deleted = 'true'
            if (null != productInstParams.getIsDeleted()) {
				predicatesAndList.add(criteriaBuilder.equal(root.get("deleted").as(Boolean.class), productInstParams.getIsDeleted()));
            }
            // name like %name%
            if (StringUtils.isNotBlank(productInstParams.getName())) {
                predicatesAndList.add(criteriaBuilder.like(root.get("name").as(String.class), productInstParams.getName()));
            }
            // runStatus = "運行中"
            if (StringUtils.isNotBlank(productInstParams.getRunStatus())) {
                predicatesAndList.add(criteriaBuilder.equal(root.get("runStatus").as(String.class), productInstParams.getRunStatus()));
            }
            // createdTime >= start
            if (!Objects.isNull(start)) {
                predicatesAndList.add(criteriaBuilder.greaterThanOrEqualTo(root.get("createdTime").as(Date.class), start));
            }
            // createdTime <= end
            if (!Objects.isNull(end)) {
                predicatesAndList.add(criteriaBuilder.lessThanOrEqualTo(root.get("createdTime").as(Date.class), end));
            }
            // id in ('1','2')
            if (!CollectionUtils.isEmpty(productInstParams.getIds())) {
                CriteriaBuilder.In<String> in = criteriaBuilder.in(root.get("id").as(String.class));
                productInstParams.getIds().forEach(in::value);
                predicatesAndList.add(in);
            }
            Predicate andPredicate = criteriaBuilder.and(predicatesAndList.toArray(new Predicate[predicatesAndList.size()]));
            query.where(andPredicate);
            return query.getRestriction();
        }, pageable);
        return PageUtil.generatePageInfoVO(productInstPage);
    }
}

解釋:
jpa分頁查詢調(diào)的方法是:
Page findAll(@Nullable Specification spec, Pageable pageable);
該方法接受兩個參數(shù):
一個是 Specification 對象,用于構(gòu)建復(fù)雜的查詢條件;
另一個是之前創(chuàng)建的pageable對象,用于指定分頁及排序信息。
點進去可以直接看到

下面我再解釋一下這行代碼

criteriaBuilder.equal(root.get("runStatus").as(String.class), productInstParams.getRunStatus());

1. criteriaBuilder 是javax.persistence.criteria.CriteriaBuilder的一個實例,它是用來構(gòu)建JPQL查詢條件的對象。

2. root 是代表查詢主表的Root對象,它指向ProductInst實體類對應(yīng)的數(shù)據(jù)庫表。

3. root.get(“runStatus”) 表示獲取ProductInst實體類中的runStatus屬性(注意:這地方寫的不是數(shù)據(jù)庫的字段,我數(shù)據(jù)庫的字段是:run_status)。這個方法返回的是一個Path<未知類型>對象,表示runStatus字段在查詢路徑上的位置。

4. .as(String.class) 是類型轉(zhuǎn)換,確保runStatus被視為String類型,因為在數(shù)據(jù)庫中它可能被映射為VARCHAR或者其他文本類型字段。

5. productInstParams.getRunStatus() 獲取傳入?yún)?shù)對象productInstParams中的runStatus屬性值,這是一個待匹配的實際值。
綜上所述:這段代碼對應(yīng)的sql

WHERE run_status = 'XXXX'

Repository:

@Repository
public interface ProductInstRepository extends JpaRepository<ProductInst, String>, JpaSpecificationExecutor<ProductInst> {
}

PageInfoVO:

package com.king.alice.common.base;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
/**
 * @Author wlt
 * @Description 分頁數(shù)據(jù)中的元素
 * @Date 2022/8/26
 **/
@Getter
@Setter
public class PageInfoVO<T> extends BaseVO{
    private static final long serialVersionUID = -3542944936096780651L;
    /**
     * 總記錄數(shù)
     */
    private long total;
    /**
     * 當(dāng)前頁
     */
    private int pageNum;
    /**
     * 每頁的數(shù)量
     */
    private int pageSize;
    /**
     * 結(jié)果集
     */
    private List<T> list;
}

PageUtil:

package com.king.alice.common.util;
import com.king.alice.common.base.PageInfoVO;
import org.springframework.data.domain.Page;
/**
 * @author 大魔王
 * @description:
 * @date 2024/3/22 11:02
 */
public class PageUtil {
    /**
     * 根據(jù)Page對象生成PageInfoVO
     *
     * @param page Page包裝對象
     * @return PageDto 對象
     */
    @SuppressWarnings({"unchecked"})
    public static <T> PageInfoVO<T> generatePageInfoVO(Page page) {
        PageInfoVO result = new PageInfoVO();
        result.setPageNum(page.getNumber() + 1);
        result.setPageSize(page.getPageable().getPageSize());
        result.setTotal(page.getTotalElements());
        result.setList(page.getContent());
        return result;
    }
}

ProductInstParams:

package com.king.alice.manage.instance.params;
import lombok.Data;
import java.util.List;
/**
 * @author 大魔王
 * @description: TODO
 * @date 2024/3/21 16:56
 */
@Data
public class ProductInstParams {
    /**
     * 當(dāng)前頁
     */
    private int pageNo;
    /**
     * 每頁的數(shù)量
     */
    private int pageSize;
    /**
     * 名字
     */
    private List<String> ids;
    /**
     * 名字
     */
    private String name;
    /**
     * 運行狀態(tài)
     */
    private String runStatus;
    private String startDate;
    private String endDate;
    private Boolean isDeleted;
}

測試:

響應(yīng)結(jié)果:

控制臺打印sql:

到此這篇關(guān)于SpringJPA 做分頁條件查詢的文章就介紹到這了,更多相關(guān)SpringJPA 分頁內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 在MyBatis中使用接口映射的步驟詳解

    在MyBatis中使用接口映射的步驟詳解

    在MyBatis中使用接口映射是一種基于Java接口而非XML映射文件的方式來綁定SQL查詢和操作,這種方法使用注解來指定SQL語句,并將其直接關(guān)聯(lián)到接口方法上,本文給大家介紹了在MyBatis中使用接口映射的步驟,需要的朋友可以參考下
    2024-06-06
  • 淺析java中密文的創(chuàng)建和校驗

    淺析java中密文的創(chuàng)建和校驗

    這篇文章主要為大家詳細介紹了java中密文的創(chuàng)建和校驗的相關(guān)知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • Java設(shè)計模式之淺談外觀模式

    Java設(shè)計模式之淺談外觀模式

    這篇文章主要介紹了Java設(shè)計模式之外觀模式的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • Java double轉(zhuǎn)BigDecimal的注意事項說明

    Java double轉(zhuǎn)BigDecimal的注意事項說明

    這篇文章主要介紹了Java double轉(zhuǎn)BigDecimal的注意事項說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • Java中String.join()高效字符串拼接的實現(xiàn)

    Java中String.join()高效字符串拼接的實現(xiàn)

    本文主要介紹了Java中String.join()高效字符串拼接的實現(xiàn),包括基礎(chǔ)拼接、StreamAPI結(jié)合、非字符串類型處理及與傳統(tǒng)方式對比,具有一定的參考價值,感興趣的可以了解一下
    2025-05-05
  • 深入解析四大主流Java?AI?Agent框架的選擇與應(yīng)用

    深入解析四大主流Java?AI?Agent框架的選擇與應(yīng)用

    本文將帶你全面盤點當(dāng)前主流的?Java?AI?Agent?框架,深入解析它們的技術(shù)特性、使用方式,并通過實戰(zhàn)案例教你如何快速上手,快跟隨小編一起學(xué)習(xí)起來吧
    2026-04-04
  • spring MVC搭建及配置詳解

    spring MVC搭建及配置詳解

    本篇文章主要介紹了spring MVC配置方法,要想靈活運用Spring MVC來應(yīng)對大多數(shù)的Web開發(fā),就必須要掌握它的配置及原理,有興趣的可以了解一下。
    2017-01-01
  • Spring Boot Web應(yīng)用開發(fā) CORS 跨域請求支持

    Spring Boot Web應(yīng)用開發(fā) CORS 跨域請求支持

    本篇文章主要介紹了Spring Boot Web應(yīng)用開發(fā) CORS 跨域請求支持,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • Springboot敏感字段脫敏的實現(xiàn)思路

    Springboot敏感字段脫敏的實現(xiàn)思路

    這篇文章主要介紹了Springboot敏感字段脫敏的實現(xiàn)思路,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2021-09-09
  • 解決Error occurred during initialization of VM Java虛擬機初始化失敗問題

    解決Error occurred during initialization o

    這篇文章主要介紹了解決Error occurred during initialization of VM Java虛擬機初始化失敗問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03

最新評論

明溪县| 滨州市| 榆社县| 宿迁市| 宽甸| 鹤峰县| 大城县| 三穗县| 永年县| 车险| 乌拉特前旗| 永嘉县| 高雄市| 习水县| 南川市| 罗山县| 平凉市| 杨浦区| 沾益县| 无棣县| 克什克腾旗| 新乡市| 那坡县| 扎赉特旗| 鸡东县| 江都市| 桃园市| 德庆县| 民勤县| 天全县| 琼中| 保山市| 宣城市| 万宁市| 湖北省| 安化县| 吴桥县| 德江县| 丁青县| 扶沟县| 崇阳县|