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ì)于這種查詢卻無(wú)法綁定到原有的實(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è)包裝類來(lái)接收查詢結(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來(lái)實(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()來(lái)處理總條數(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)文章
springboot-jpa的實(shí)現(xiàn)操作
這篇文章主要介紹了springboot-jpa的實(shí)現(xiàn)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2021-03-03springboot項(xiàng)目不加端口號(hào)也可以訪問項(xiàng)目的方法步驟分析
這篇文章主要介紹了springboot項(xiàng)目不加端口號(hào)也可以訪問項(xiàng)目的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04IntellJ idea使用FileWatch實(shí)時(shí)編譯less文件的方法
這篇文章主要介紹了IntellJ idea使用FileWatch實(shí)時(shí)編譯less文件的相關(guān)資料,需要的朋友可以參考下2018-02-02Spring Mvc下實(shí)現(xiàn)以文件流方式下載文件的方法示例
這篇文章主要介紹了Spring Mvc下實(shí)現(xiàn)以文件流方式下載文件的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2019-05-05已解決:No ''Access-Control-Allow-Origin''跨域問題
這篇文章主要介紹了已解決:No 'Access-Control-Allow-Origin' 跨域,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06劍指Offer之Java算法習(xí)題精講鏈表專項(xiàng)訓(xùn)練
跟著思路走,之后從簡(jiǎn)單題入手,反復(fù)去看,做過之后可能會(huì)忘記,之后再做一次,記不住就反復(fù)做,反復(fù)尋求思路和規(guī)律,慢慢積累就會(huì)發(fā)現(xiàn)質(zhì)的變化2022-03-03