1. 程式人生 > >Java Dao實現group by 分組查詢功能

Java Dao實現group by 分組查詢功能

前言

今天要實現一個功能,去資料庫查詢一個欄位,查出該欄位有幾個不同的值,以及每個值有多少條記錄。我想到的是group by分組查詢功能,以前雖然學習過,但是沒具體去實踐,沒想到今天實現過程中糾結了很久,我把遇見的問題記錄下來供參考

實現效果

這裡寫圖片描述

實現過程

1.建立一個VO類,用於封裝查詢到的資訊

public class MainPage {

  private String zczt;    //儲存資料表 欄位 中的值

  private Long count;     //儲存每個 值 有多少條記錄

  /**
   * 定義預設構造器
   * 
   * 初始化 {@link MainPage} 類的新例項。
   */
public MainPage() {} /** * 過載構造器 * * 初始化 {@link MainPage} 類的新例項。 * @param zczt * @param count */ public MainPage(String zczt, Long count) { super(); this.zczt = zczt; this.count = count; } public String getZczt() { return zczt; } public void setZczt
(String zczt) { this.zczt = zczt; } public Long getCount() { return count; } public void setCount(Long count) { this.count = count; } }

2.在Dao層寫查詢語句,獲取資料

@SuppressWarnings("unchecked")
public void countData() {

    StringBuilder jpql = new StringBuilder("select new assets.main.management.entity.MainPage(list.zczt,count(list.zczt)) from ZC_LIST_INFO list group by list.zczt"
); Query query = entityManager.createQuery(jpql.toString()); List<MainPage> list = query.getResultList(); for (int i=0; i < list.size(); i++) { MainPage mainPage = list.get(i); System.out.println("------數值----"+mainPage.getZczt()); System.out.println("------每個數值的記錄條數----"+mainPage.getCount()); } }

結果

這裡寫圖片描述

成功取出資料

總結

1.如何寫 SQL 語句?
在實現過程中,這個是最糾結的一個問題,sql語句整麼寫。最開始我是這樣寫的:

select list.zczt,count(list.zczt) from ZC_LIST_INFO list group by list.zczt

那麼,要整麼去獲取到查詢的結果?
列印了下 query.getResultList( ),返回的結果到底是什麼東西,好吧,其實就是五個物件,那麼肯定要有東西去接收這些物件,再把資料取出來
假設一:用自定義的VO類去接收

List< MainPage > list = query.getResultList();

for (int i=0; i < list.size(); i++) {

      MainPage mainPage = list.get(i);

      System.out.println("------數值----"+mainPage.getZczt());

      System.out.println("------每個數值的記錄條數----"+mainPage.getCount());
}

分別讀取出來,但是最後發現,控制檯列印異常,如下:

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to assets.main.management.entity.MainPage

不能封裝到該類中去,這種假設失敗

假設二:既然不能用 VO類,那麼用 資料表對映的 entity去接收?好吧,這種想想就可以了,資料表中都沒有count這個欄位

假設三:List 不規定型別呢?直接 List list = query.getResultList(); 試了下,還是不行,取不出 zczt 和 count 兩個屬性的值呀

假設N:假設已用光

好吧,只有從sql語句那裡做文章了,直接在查詢時通過構造器初始化

StringBuilder jpql = new StringBuilder("select new assets.main.management.entity.MainPage(list.zczt,count(list.zczt)) from ZC_LIST_INFO list group by list.zczt");

這樣寫我其實有很大的懷疑的,因為 count(list.zczt)這東西,到底能不能初始化成功,之前直接一個 count就完事兒了,現在還要加個小括號,帶一點小尾巴,很是讓人覺得有錯。好吧,最後發現,帶點小尾巴其實也挺可愛的,能成功解析。最後用 VO 去接收,perfect,可以的!

2.count這屬性,是什麼型別?
之前使用 int count 去宣告count,結果在查詢時初始化報錯:
這裡寫圖片描述
無法寫入構造器,在位置沒有寫錯的情況下,那麼就是型別的錯誤了。根據前輩的解釋,select count(*)返回的型別一般是 Long 型,但是我沒找到具體的api,在 mysql的api中也沒有提出(難道我遇見了一個假的mysql???嚴重懷疑)

這裡寫圖片描述

最後還是改為 Long,測試一下,可以了。

文章中有錯有不妥之處,還請各位前輩留下珍貴的建議,小編在此五體跪謝!!!