Springboot?jpa使用sum()函數(shù)返回結(jié)果如何被接收
jpa使用sum()返回結(jié)果如何接收
1、需求
我的需求是統(tǒng)計域名以及域名出現(xiàn)的次數(shù)。
之前使用springboot jpa都是把數(shù)據(jù)庫中的表跟實體類綁定,創(chuàng)建繼承JpaRepository的接口。如下:
@Repository public interface UrlsRepository extends JpaRepository<Urls, String> { Optional<Urls> findById(Integer id); }
但是對于這種查詢卻無法綁定到原有的實體類。那么改怎么解決這種需求呢?
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語言。設(shè)為true表示使用本地sql(數(shù)據(jù)庫對應(yīng)的sql)
測試:
@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、解決方法二
用一個包裝類來接收查詢結(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、查詢的表對應(yīng)的是已經(jīng)綁定的實體類Urls 3、nativeQuery設(shè)為false,表示使用的是jpql語言。 */ @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();
測試:
@Test public void findDomainCount() { List<DomainVo> domainCount = urlsRepository.findDomainCount(); for (DomainVo vo : domainCount) { System.out.println(vo); } }
結(jié)果:
jpa使用count函數(shù)和sum函數(shù)
最近在使用JPQL時遇到了一個問題,關(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,不然會出空指針異常,count函數(shù)不用判斷null ? ? ? ? if(list.get(0) == null){ ? ? ? ? ? ? return 0; ? ? ? ? } ? ? ? ? else{ ? ? ? ? ? ? return ((Long)list.get(0)).longValue(); ? ? ? ? } ? ? }
剛開始使用JPA時,基本都依賴@query(SQL)注解通過原生sql來實現(xiàn)
根據(jù)編號統(tǒng)計條數(shù):
方法一
@Query(" select count(t) from FollowerInfo t where investUserId = :invUserId") Integer findFollowerNumberByInvUserId(@Param("invUserId") Long invUserId);
這種原生的方式,跟直接寫SQL沒什么區(qū)別。雖然能實現(xiàn)功能,但是浪費了JPA的簡潔簡化代碼的設(shè)計的優(yōu)點。
網(wǎng)上看到另外一個方法:
List findAll(Specification spec);
在repository層findAll,然后在service層封裝,獲取list.size()來處理總條數(shù)問題。
這樣避免了寫SQL語句。
今天看了一下CrudRepository的源碼 發(fā)現(xiàn)該接口源碼里面有一個函數(shù):
方法二
/** * Returns the number of entities available. * * @return the number of entities */ long count();
于是繼承了CrudRepository 寫了一個demo:
方法三
Long countByInvestUserId(Long investUserId);
一行代碼就全部搞定! 效果跟方法1一樣
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot項目不加端口號也可以訪問項目的方法步驟分析
這篇文章主要介紹了springboot項目不加端口號也可以訪問項目的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04IntellJ idea使用FileWatch實時編譯less文件的方法
這篇文章主要介紹了IntellJ idea使用FileWatch實時編譯less文件的相關(guān)資料,需要的朋友可以參考下2018-02-02Spring Mvc下實現(xiàn)以文件流方式下載文件的方法示例
這篇文章主要介紹了Spring Mvc下實現(xiàn)以文件流方式下載文件的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-05已解決:No ''Access-Control-Allow-Origin''跨域問題
這篇文章主要介紹了已解決:No 'Access-Control-Allow-Origin' 跨域,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06劍指Offer之Java算法習(xí)題精講鏈表專項訓(xùn)練
跟著思路走,之后從簡單題入手,反復(fù)去看,做過之后可能會忘記,之后再做一次,記不住就反復(fù)做,反復(fù)尋求思路和規(guī)律,慢慢積累就會發(fā)現(xiàn)質(zhì)的變化2022-03-03