Springboot?jpa使用sum()函數(shù)返回結(jié)果如何被接收
jpa使用sum()返回結(jié)果如何接收
1、需求
我的需求是統(tǒng)計(jì)域名以及域名出現(xiàn)的次數(shù)。

之前使用springboot jpa都是把數(shù)據(jù)庫(kù)中的表跟實(shí)體類綁定,創(chuàng)建繼承JpaRepository的接口。如下:
@Repository
public interface UrlsRepository extends JpaRepository<Urls, String> {
Optional<Urls> findById(Integer id);
}但是對(duì)于這種查詢卻無法綁定到原有的實(shí)體類。那么改怎么解決這種需求呢?
2、解決方法一
使用Object[] 數(shù)組接收每一行數(shù)據(jù),用List<Object[]>接收查詢結(jié)果。
repository中的寫法
@Query(value = "SELECT domain,sum(visit_count) from Urls GROUP BY domain ORDER BY sum(visit_count) desc", nativeQuery = true)
List<Object[]> findDomainAndCount();注意:@Query的nativeQuery屬性值默認(rèn)是false,表示使用JPQL語(yǔ)言。設(shè)為true表示使用本地sql(數(shù)據(jù)庫(kù)對(duì)應(yīng)的sql)
測(cè)試:
@Test
public void findDomainAndCount() {
List<Object[]> list = urlsRepository.findDomainAndCount();
for (Object[] objs : list) {
for (int i = 0; i < objs.length; i++) {
System.out.print(String.valueOf(objs[i]) + ",");
}
System.out.println();
}
}結(jié)果:

3、解決方法二
用一個(gè)包裝類來接收查詢結(jié)果。
@Getter
@Setter
@ToString
public class DomainVo {
private String domain;
private Long visitCount;
public DomainVo(String domain, Long visitCount) {
this.domain = domain;
this.visitCount = visitCount;
}
}repository寫法
/*
注意:
1、使用的是全類名
2、查詢的表對(duì)應(yīng)的是已經(jīng)綁定的實(shí)體類Urls
3、nativeQuery設(shè)為false,表示使用的是jpql語(yǔ)言。
*/
@Query(value = "SELECT new com.ununie.chromehistory.model.vo.DomainVo(u.domain,sum(u.visitCount)) from Urls u GROUP BY u.domain ORDER BY sum(u.visitCount) desc")
List<DomainVo> findDomainCount();測(cè)試:
@Test
public void findDomainCount() {
List<DomainVo> domainCount = urlsRepository.findDomainCount();
for (DomainVo vo : domainCount) {
System.out.println(vo);
}
}結(jié)果:

jpa使用count函數(shù)和sum函數(shù)
最近在使用JPQL時(shí)遇到了一個(gè)問題,關(guān)于count函數(shù)和sum函數(shù)不知該如何取值,在網(wǎng)上查了查資料,找到了一種解決方法
具體代碼如下:
public long getObjectsCountByQueryString(String queryString) {
? ? ? ? //queryString = "select count(o) from MyModel as o";?
? ? ? ? long count = 0;?
? ? ? ? count = ((Long)getJpaTemplate().find(queryString).get(0)).longValue();
? ? ? ? return count;?
? ? } ?? ??
? ? public long getObjectsSumByQueryString(String queryString) {
? ? ? ? //queryString = "select sum(o.price) from MyModel as o";?
? ? ? ? List list = getJpaTemplate().find(queryString);
? ? ? ? //使用sum函數(shù)要注意這里要先判斷是否為null,不然會(huì)出空指針異常,count函數(shù)不用判斷null
? ? ? ? if(list.get(0) == null){
? ? ? ? ? ? return 0;
? ? ? ? }
? ? ? ? else{
? ? ? ? ? ? return ((Long)list.get(0)).longValue();
? ? ? ? }
? ? }剛開始使用JPA時(shí),基本都依賴@query(SQL)注解通過原生sql來實(shí)現(xiàn)
根據(jù)編號(hào)統(tǒng)計(jì)條數(shù):
方法一
@Query(" select count(t) from FollowerInfo t where investUserId = :invUserId")
Integer findFollowerNumberByInvUserId(@Param("invUserId") Long invUserId);這種原生的方式,跟直接寫SQL沒什么區(qū)別。雖然能實(shí)現(xiàn)功能,但是浪費(fèi)了JPA的簡(jiǎn)潔簡(jiǎn)化代碼的設(shè)計(jì)的優(yōu)點(diǎn)。
網(wǎng)上看到另外一個(gè)方法:
List findAll(Specification spec);
在repository層findAll,然后在service層封裝,獲取list.size()來處理總條數(shù)問題。
這樣避免了寫SQL語(yǔ)句。
今天看了一下CrudRepository的源碼 發(fā)現(xiàn)該接口源碼里面有一個(gè)函數(shù):
方法二
/** * Returns the number of entities available. * * @return the number of entities */ long count();
于是繼承了CrudRepository 寫了一個(gè)demo:
方法三
Long countByInvestUserId(Long investUserId);
一行代碼就全部搞定! 效果跟方法1一樣
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java網(wǎng)絡(luò)編程教程之設(shè)置請(qǐng)求超時(shí)的方法
這篇文章主要給大家介紹了關(guān)于Java網(wǎng)絡(luò)編程教程之設(shè)置請(qǐng)求超時(shí)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12
Spring?循環(huán)依賴之AOP實(shí)現(xiàn)詳情
這篇文章主要介紹了Spring?循環(huán)依賴之AOP實(shí)現(xiàn)詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的盆友可以參考一下2022-07-07
spring-boot項(xiàng)目啟動(dòng)遲緩異常排查解決記錄
這篇文章主要為大家介紹了spring-boot項(xiàng)目啟動(dòng)遲緩異常排查解決記錄,突然在本地啟動(dòng)不起來了,表象特征就是在本地IDEA上運(yùn)行時(shí),進(jìn)程卡住也不退出,應(yīng)用啟動(dòng)時(shí)加載相關(guān)組件的日志也不輸出2022-02-02
淺談Spring Boot Web 應(yīng)用性能優(yōu)化
這篇文章主要介紹了淺談Spring Boot Web 應(yīng)用性能優(yōu)化,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-07-07
Java實(shí)現(xiàn)動(dòng)態(tài)數(shù)字時(shí)鐘
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)動(dòng)態(tài)數(shù)字時(shí)鐘,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12
SpringBoot整合Thymeleaf小項(xiàng)目及詳細(xì)流程
這篇文章主要介紹了SpringBoot整合Thymeleaf小項(xiàng)目,本項(xiàng)目使用SpringBoot開發(fā),jdbc5.1.48,主要涉及到Mybatis的使用,Thymeleaf的使用,用戶密碼加密,驗(yàn)證碼的設(shè)計(jì),圖片的文件上傳(本文件上傳到本地,沒有傳到數(shù)據(jù)庫(kù))登錄過濾,需要的朋友可以參考下2022-03-03
Java窗體動(dòng)態(tài)加載磁盤文件的實(shí)現(xiàn)方法
這篇文章主要介紹了Java窗體動(dòng)態(tài)加載磁盤文件的實(shí)現(xiàn)方法,需要的朋友可以參考下2014-03-03

