激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - JAVA教程 - 使用Spring Data JPA的坑點記錄總結

使用Spring Data JPA的坑點記錄總結

2021-03-05 14:44Joryun劉家源 JAVA教程

這篇文章主要給大家總結介紹了關于使用Spring Data JPA的一些坑點,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。

前言

Spring-data-jpa的基本介紹:JPA誕生的緣由是為了整合第三方ORM框架,建立一種標準的方式,百度百科說是JDK為了實現ORM的天下歸一,目前也是在按照這個方向發展,但是還沒能完全實現。在ORM框架中,Hibernate是一支很大的部隊,使用很廣泛,也很方便,能力也很強,同時Hibernate也是和JPA整合的比較良好,我們可以認為JPA是標準,事實上也是,JPA幾乎都是接口,實現都是Hibernate在做,宏觀上面看,在JPA的統一之下Hibernate很良好的運行。

最近在使用Springboot 以及Spring data jpa ,使用jpa可以讓我更方便的操作數據庫,但在使用中也遇到了不少的坑,下面這篇文章就來記錄下,下面話不多說了,來一起看看詳細的介紹吧。

場景:

動態查詢,分頁查詢,根據傳入不同的狀態,分別查詢不同數據表,并且在傳入page對象之前用map進行VO轉換。而pageable的使用地方不同影響到了分頁數據的正確性,以此進行探討。

  • pageable使用于new PageImpl<>中,且直到最后才將List -> Page
  • pageable使用于findAll()中

前提:

Page對象封于VO內,返回數據包括了分頁數據

?
1
2
3
4
5
6
@ApiModelProperty("記錄")
private Page<ActivityRecordVO> activityRecordVOList;
@ApiModelProperty("數量")
private Integer num = 0;
@ApiModelProperty("金額")
private BigDecimal totalMoney = BigDecimal.valueOf(0);

錯誤運用:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
List<ActivityRecordVO> activityRecordVOList = new ArrayList<>();
  if (receiveSendRecordRequestVO.getSendOrReceiveType() == SendOrReceiveType.RECEIVE) {
   List<ChallengeRecord> challengeRecordList = challengeRecordDao.findByUserIdAndDeleteType(userId,
     DeleteType.FALSE);
   if (!CollectionUtils.isEmpty(challengeRecordList)) {
    activityRecordVOList = challengeRecordList.stream()
      .map(this::challengeRecordToActivityRecordVO)
      .collect(Collectors.toList());
   }
  } else if (receiveSendRecordRequestVO.getSendOrReceiveType() == SendOrReceiveType.SEND) {
   List<Activity> activityList = activityDao.findByUserIdAndDeleteType(userId, DeleteType.FALSE);
   if (!CollectionUtils.isEmpty(activityList)) {
    activityRecordVOList = activityList.stream()
      .map(this::activityTOActivityRecordVO)
      .collect(Collectors.toList());
   }
  }
?
1
2
activityReceiveSendRecordVO.setActivityRecordVOList(new PageImpl<>(activityRecordVOList,
     pageable, activityRecordVOList.size()));

解析:傳入的pageable只在set進VO的時候,用new PageIml將List轉為page對象,前端報的問題 雖然總頁數、總條數均為正確,但第一頁的條數是全部 ,數據異常!

正確參考做法:

采用Specifications先根據查詢條件動態查詢并map出相應分頁對象(此塊代碼因需求而異),這時 findAll 傳入的pageable是生效的,便會顯現正確的分頁信息。

代碼塊參考:

xxxCommonSpecUtil 是自封的specification工具類,與原生spring data jpa原生查詢方法類似。

?
1
2
3
4
5
6
7
8
9
10
11
12
Page<ActivityRecordVO> page = new PageImpl<>(activityRecordVOList, pageable, activityRecordVOList.size());
  if (receiveSendRecordRequestVO.getSendOrReceiveType() == SendOrReceiveType.RECEIVE) {
   Specifications<ChallengeRecord> spec = Specifications.where(
     challengeCommonSpecUtil.equal("userId", userId))
     .and(challengeCommonSpecUtil.equal("deleteType", DeleteType.FALSE));
   page = challengeRecordDao.findAll(spec, pageable).map(this::challengeRecordToActivityRecordVO);
  } else if (receiveSendRecordRequestVO.getSendOrReceiveType() == SendOrReceiveType.SEND) {
   Specifications<Activity> spec = Specifications.where(
     activityCommonSpecUtil.equal("userId", userId))
     .and(activityCommonSpecUtil.equal("deleteType", DeleteType.FALSE));
   page = activityDao.findAll(spec, pageable).map(this::activityTOActivityRecordVO);
  }

注:activityReceiveSendRecordVO為封裝的VO,包含了返回的Page對象

?
1
activityReceiveSendRecordVO.setActivityRecordVOList(page);

總結

使用了這么長時間spring data jpa,覺得Specifications巨好用,也不容易出錯,也是我喜歡的編碼風格,而new PageImpl<>()這種簡單粗暴的方法我一般都用在查詢數據關聯太多表的情況,在最后直接返回,更深層次的還需要再探討!

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。

原文鏈接:http://www.jianshu.com/p/cec7005ce17c

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日本xxxx视频 | 海外中文字幕在线观看 | 一级免费a | 日韩在线视频在线 | 美女扒开腿让男生桶爽网站 | 99在线免费观看视频 | 韩国十九禁高潮床戏在线观看 | 一级α片 | 91久久国产露脸精品国产护士 | 成年人在线免费播放视频 | 中文字幕精品在线视频 | 蜜桃视频在线免费观看 | 91精品免费观看 | 国产噜噜噜噜噜久久久久久久久 | 草莓福利社区在线 | 久久国产精品久久久久久电车 | av在线中文 | 欧美一级免费在线观看 | 国产精品久久久久久影院8一贰佰 | 日本精品久久久久 | 看片91| 成人午夜高清 | 国产精品99一区二区 | 91丝袜| 青草视频在线观看视频 | 欧美一级免费在线观看 | 一级黄色av电影 | 欧美在线观看视频一区二区 | 欧美日韩大片在线观看 | 久久久久夜色精品国产老牛91 | 超碰99在线观看 | 免费午夜视频 | 毛片免费大全短视频 | 亚洲精品在线观看网站 | 久久蜜桃香蕉精品一区二区三区 | 日日久视频 | 9797色| 狠狠色成色综合网 | 男女做性免费网站 | 视频h在线| 国产一区二区高清在线 |