欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Springboot?jpa使用sum()函數(shù)返回結(jié)果如何被接收

 更新時(shí)間:2022年02月23日 14:24:29   作者:ununie  
這篇文章主要介紹了Springboot?jpa使用sum()函數(shù)返回結(jié)果如何接收,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

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)文章

最新評(píng)論