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,測試一下,可以了。
文章中有錯有不妥之處,還請各位前輩留下珍貴的建議,小編在此五體跪謝!!!