一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|JavaScript|易語(yǔ)言|

服務(wù)器之家 - 編程語(yǔ)言 - JAVA教程 - 使用Spring Data JPA的坑點(diǎn)記錄總結(jié)

使用Spring Data JPA的坑點(diǎn)記錄總結(jié)

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

這篇文章主要給大家總結(jié)介紹了關(guān)于使用Spring Data JPA的一些坑點(diǎn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。

前言

Spring-data-jpa的基本介紹:JPA誕生的緣由是為了整合第三方ORM框架,建立一種標(biāo)準(zhǔn)的方式,百度百科說(shuō)是JDK為了實(shí)現(xiàn)ORM的天下歸一,目前也是在按照這個(gè)方向發(fā)展,但是還沒(méi)能完全實(shí)現(xiàn)。在ORM框架中,Hibernate是一支很大的部隊(duì),使用很廣泛,也很方便,能力也很強(qiáng),同時(shí)Hibernate也是和JPA整合的比較良好,我們可以認(rèn)為JPA是標(biāo)準(zhǔn),事實(shí)上也是,JPA幾乎都是接口,實(shí)現(xiàn)都是Hibernate在做,宏觀上面看,在JPA的統(tǒng)一之下Hibernate很良好的運(yùn)行。

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

場(chǎng)景:

動(dòng)態(tài)查詢,分頁(yè)查詢,根據(jù)傳入不同的狀態(tài),分別查詢不同數(shù)據(jù)表,并且在傳入page對(duì)象之前用map進(jìn)行VO轉(zhuǎn)換。而pageable的使用地方不同影響到了分頁(yè)數(shù)據(jù)的正確性,以此進(jìn)行探討。

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

前提:

Page對(duì)象封于VO內(nèi),返回?cái)?shù)據(jù)包括了分頁(yè)數(shù)據(jù)

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

錯(cuò)誤運(yùn)用:

?
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進(jìn)VO的時(shí)候,用new PageIml將List轉(zhuǎn)為page對(duì)象,前端報(bào)的問(wèn)題 雖然總頁(yè)數(shù)、總條數(shù)均為正確,但第一頁(yè)的條數(shù)是全部 ,數(shù)據(jù)異常!

正確參考做法:

采用Specifications先根據(jù)查詢條件動(dòng)態(tài)查詢并map出相應(yīng)分頁(yè)對(duì)象(此塊代碼因需求而異),這時(shí) findAll 傳入的pageable是生效的,便會(huì)顯現(xiàn)正確的分頁(yè)信息。

代碼塊參考:

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對(duì)象

?
1
activityReceiveSendRecordVO.setActivityRecordVOList(page);

總結(jié)

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

好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)服務(wù)器之家的支持。

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 四虎成人免费观看在线网址 | 欧美精品综合一区二区三区 | 福利国模私拍视频在线观看 | 视频大全在线观看网址 | 美女校花被调教出奶水 | 婚前试爱全集免费观看 | 国产欧美久久一区二区 | 久久精品美女 | 午夜精品久久久久久久99 | 天天狠天天透天干天天怕处 | 日韩欧美精品一区二区 | 给我免费观看的视频在线播放 | 精品久久久噜噜噜久久7 | 美女下面被cao出水 美女污视频 | 亚洲入口 | 92在线视频 | 日韩欧美成末人一区二区三区 | 久久这里只有精品视频e | 日韩欧免费一区二区三区 | 精品国产麻豆免费人成网站 | 91香蕉国产在线观看人员 | 日本精品久久久久中文字幕 1 | 日本公与妇中文在线 | 日韩毛片在线 | 含羞草传媒网站免费进入欢迎 | 久久这里有精品 | 人体做爰aaaa免费 | 性导航h| 日本不卡一区二区三区在线观看 | 亚洲日本中文字幕天天更新 | av中文字幕在线 | 亚洲福利视频一区 | 午夜亚洲精品久久久久久 | 88av视频在线观看 | 亚州vs欧州vs日 | 亚洲成人视屏 | 欧美专区综合 | 色综合久久中文字幕网 | 99 久久99久久精品免观看 | 高h校花 | 污网站免费观看在线高清 |