日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java用tkmapper分组查询_mybatis example group by count 分组求和 - java分组求和

發布時間:2025/3/15 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java用tkmapper分组查询_mybatis example group by count 分组求和 - java分组求和 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、簡單說明

本以為mybatis的example可以搞定group by,后面看到說不行

于是曲線救國,直接查出一個list,然后再用java對數據進行操作

不過話說回來,這樣寫是比寫sql麻煩一點,但是個人感覺這樣效率會高一點(未做對比測試)

二、需求說明

查出數據庫中,過去30天,每個用戶(merId)每天的發送條數

改進版,在1的基礎上,加上所有日期的統計信息,對應日期沒記錄也加上

三、所用技術概要

jodatime:方便對時間進行操作,轉換等

stream:對java進行操作,很是方便,此處只是stream用法的冰山一角

四、代碼實現

省略了生成的實體類、mapper、example等

需求1實現

public Map coountDays(String merId){

SmsCustomerSendDetailExample example = new SmsCustomerSendDetailExample();

// 查詢條件

DateTime dt = new DateTime();

// 當天00:00:00往前推30天

DateTime days = dt.withTimeAtStartOfDay().minusDays(30);

Criteria criteria = example.createCriteria();

criteria.andCustomerIdEqualTo(merId);

criteria.andCreateTimeBetween(days.toDate(),dt.toDate());

List details = sendDetailMapper.selectByExample(example);

// 對時間進行更改,清洗為yyyyMMdd(后面按天分組用)

for (SmsCustomerSendDetail detail : details) {

DateTime dateTime = new DateTime(detail.getCreateTime().getTime()).withTimeAtStartOfDay();

detail.setCreateTime(dateTime.toDate());

}

//根據日期分組

Map> dateListMap = details.stream()

.collect(Collectors.groupingBy(SmsCustomerSendDetail::getCreateTime));

// 遍歷map,求出當天記錄的條數

HashMap resMap = new HashMap<>(128);

for (Entry> detailEntry:dateListMap.entrySet()){

String day = new DateTime(detailEntry.getKey().getTime()).toString("yyyyMMdd");

int daySize = detailEntry.getValue().size();

resMap.put(Integer.valueOf(day),daySize);

}

// 排序

Stream> st = resMap.entrySet().stream();

Map result = new LinkedHashMap<>(32);

st.sorted(Comparator.comparing(e -> e.getKey())).forEach(e -> result.put(e.getKey(), e.getValue()));

return result;

}

結果:{20180306:44,20180307:14,20180308:9}

需求2實現

public Map coountDays(String merId){

SmsCustomerSendDetailExample example = new SmsCustomerSendDetailExample();

// 查詢條件

DateTime dt = new DateTime();

// 當天00:00:00往前推30天

DateTime days = dt.withTimeAtStartOfDay().minusDays(30);

Criteria criteria = example.createCriteria();

criteria.andCustomerIdEqualTo(merId);

criteria.andCreateTimeBetween(days.toDate(),dt.toDate());

List details = sendDetailMapper.selectByExample(example);

// 對時間進行更改,清洗為yyyyMMdd(后面按天分組用)

for (SmsCustomerSendDetail detail : details) {

DateTime dateTime = new DateTime(detail.getCreateTime().getTime()).withTimeAtStartOfDay();

detail.setCreateTime(dateTime.toDate());

}

//根據日期分組

Map> dateListMap = details.stream()

.collect(Collectors.groupingBy(SmsCustomerSendDetail::getCreateTime));

// 遍歷map,求出當天記錄的條數

HashMap resMap = new HashMap<>(128);

for (Entry> detailEntry:dateListMap.entrySet()){

String day = new DateTime(detailEntry.getKey().getTime()).toString("yyyyMMdd");

int daySize = detailEntry.getValue().size();

resMap.put(Integer.valueOf(day),daySize);

}

// 添加過去30天所有天為key,從resMap中取出有數據的,否則為0

Map result = new LinkedHashMap<>(32);

for (int i = 0; i < 30; i++) {

String yyyyMMdd = days.plusDays(i).toString("yyyyMMdd");

Integer day = Integer.valueOf(yyyyMMdd);

int value = 0;

if (resMap.containsKey(day)){

value = resMap.get(day);

}

result.put(Integer.valueOf(yyyyMMdd),value);

}

return result;

}

結果:{20180213:0,20180214:0,20180215:0,20180216:0,20180217:0,20180218:0,20180219:0,20180220:0,20180221:0,20180222:0,20180223:0,20180224:0,20180225:0,20180226:0,20180227:0,20180228:0,20180301:0,20180302:0,20180303:0,20180304:0,20180305:0,20180306:44,20180307:14,20180308:9,20180309:0,20180310:0,20180311:0,20180312:0,20180313:0,20180314:0}

總結

以上是生活随笔為你收集整理的java用tkmapper分组查询_mybatis example group by count 分组求和 - java分组求和的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。