解決HIbernate分頁問題獲取表總行數的小Bug
今天上午回來設計了一點新聞釋出系統周邊的功能,並實現了對新聞進行重新索引的功能。
但同時在列出相關新聞的時候遇到了麻煩。就是原本執行好好的分頁查詢程式碼,居然有個小蟲子跑出來,
很是令人不爽。說來也慚愧,Hibernate也用了那麼長時間了。可對底層API卻很不屬性。
查了下網路,把自己的一知半解說出來。
bug起源。
看看程式碼:
相信大家對上面的程式碼也很熟悉了,這個程式碼第一次執行的時候沒問題。
等你去拿第2頁的時候,就提示說出現NullPointer。 發現是((Integer) criteria.setProjection(Projections.rowCount()).uniqueResult())為Null, 也就是根本就拿不到表總數。
為此我思考了好一陣子。
後來看了別人的程式碼才煥然大悟。
看第2個程式碼:
但同時在列出相關新聞的時候遇到了麻煩。就是原本執行好好的分頁查詢程式碼,居然有個小蟲子跑出來,
很是令人不爽。說來也慚愧,Hibernate也用了那麼長時間了。可對底層API卻很不屬性。
查了下網路,把自己的一知半解說出來。
bug起源。
看看程式碼:
return (PageSupport) getHibernateTemplate().execute(
new HibernateCallback() ...{
public Object doInHibernate(Session session)
throws HibernateException ...{
Criteria criteria = detachedCriteria
.getExecutableCriteria(session);
logger.debug("SQL: " + Projections.rowCount());
//執行查詢
int totalCount = ((Integer) criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();
List items = criteria.setFirstResult(startIndex)
.setMaxResults(pageSize).list();
PageSupport ps = new PageSupport(items, totalCount,
pageSize, startIndex);
return ps;
}
}, true);
new HibernateCallback() ...{
public Object doInHibernate(Session session)
throws HibernateException ...{
Criteria criteria = detachedCriteria
.getExecutableCriteria(session);
logger.debug("SQL: " + Projections.rowCount());
//執行查詢
int totalCount = ((Integer) criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();
List items = criteria.setFirstResult(startIndex)
.setMaxResults(pageSize).list();
PageSupport ps = new PageSupport(items, totalCount,
pageSize, startIndex);
return ps;
}
}, true);
相信大家對上面的程式碼也很熟悉了,這個程式碼第一次執行的時候沒問題。
等你去拿第2頁的時候,就提示說出現NullPointer。 發現是((Integer) criteria.setProjection(Projections.rowCount()).uniqueResult())為Null, 也就是根本就拿不到表總數。
為此我思考了好一陣子。
後來看了別人的程式碼才煥然大悟。
看第2個程式碼:
return (PageSupport) getHibernateTemplate().execute(
new HibernateCallback() ...{
public Object doInHibernate(Session session)
throws HibernateException ...{
Criteria criteria = detachedCriteria
.getExecutableCriteria(session);
CriteriaImpl impl = (CriteriaImpl) criteria;
//先把Projection和OrderBy條件取出來,清空兩者來執行Count操作
Projection projection = impl.getProjection();
logger.debug("SQL: " + Projections.rowCount());
//執行查詢
int totalCount = ((Integer) criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();
//將之前的Projection和OrderBy條件重新設回去
criteria.setProjection(projection);
if (projection == null) ...{
criteria.setResultTransformer(CriteriaSpecification.ROOT_ENTITY);
}
List items = criteria.setFirstResult(startIndex)
.setMaxResults(pageSize).list();
PageSupport ps = new PageSupport(items, totalCount,
pageSize, startIndex);
return ps;
}
}, true);
new HibernateCallback() ...{
public Object doInHibernate(Session session)
throws HibernateException ...{
Criteria criteria = detachedCriteria
.getExecutableCriteria(session);
CriteriaImpl impl = (CriteriaImpl) criteria;
//先把Projection和OrderBy條件取出來,清空兩者來執行Count操作
Projection projection = impl.getProjection();
logger.debug("SQL: " + Projections.rowCount());
//執行查詢
int totalCount = ((Integer) criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();
//將之前的Projection和OrderBy條件重新設回去
criteria.setProjection(projection);
if (projection == null) ...{
criteria.setResultTransformer(CriteriaSpecification.ROOT_ENTITY);
}
List items = criteria.setFirstResult(startIndex)
.setMaxResults(pageSize).list();
PageSupport ps = new PageSupport(items, totalCount,
pageSize, startIndex);
return ps;
}
}, true);
相關文章
- 解決PHP Post獲取不到非表單資料的問題PHP
- 398、Java框架52 -【Hibernate - 分頁、兩種獲取方式】 2020.10.27Java框架
- SQL Server 怎麼在分頁獲取資料的同時獲取到總記錄數SQLServer
- 關於陣列的物件獲取及排序問題/小程式的多層頁面返回問題陣列物件排序
- SQL Server在分頁獲取資料的同時獲取到總記錄數的兩種方法SQLServer
- MySQL的count(*)的優化,獲取千萬級資料表的總行數MySql優化
- 前後端頁面分離導致session無法正常獲取的問題後端Session
- C#、IIS獲取時間帶星期問題解決C#
- node express 在使用mysql執行SELECT count(*) from xx獲取總數取值格式問題ExpressMySql
- python爬蟲爬取網頁中文亂碼問題的解決Python爬蟲網頁
- Lavarel Ajax 分頁時 獲取分頁資訊
- 嘗試解決微信小程式分頁最後setData資料太大限制的問題微信小程式
- 只需一個小bug,就可獲取facebook頁面的管理員許可權
- 解決Snackbar無法進行跨頁面展示的問題
- 解決Spring Data JPA Hibernate的N+1問題的最佳方法Spring
- JDBC獲取表的列數JDBC
- 解決AI的小資料問題AI
- 解決flask伺服器使用gunicorn啟動時,獲取全域性變數失敗的問題Flask伺服器變數
- 微信小程式 解決 數字粗細不一 的bug微信小程式
- 如何捕獲問題SQL解決過度CPU消耗的問題SQL
- 微信小程式攜帶引數跳轉頁面/獲取頁面棧微信小程式
- hibernate中的no session問題Session
- Node.js 解決Gzip下獲取真實的下載進度問題Node.js
- tp6 路由匹配引數獲取問題路由
- 資料庫系列:巨量資料表的分頁效能問題資料庫
- SpringMVC的資料獲取問題SpringMVC
- 獲取上個月的問題
- [Mark]解決ElasticSearch深度分頁機制中Result window is too large問題Elasticsearch
- 快取穿透問題與解決方法快取穿透
- 關於 Laravel 分頁的問題?Laravel
- Big Sur bug彙總與解決:macOS Big Sur更新後你遇到了哪些問題?Mac
- 解決ios雙擊頁面上移問題iOS
- 線上問題總結-獲取不到連線池(logback 配置+程式碼問題)
- 實戰!聊聊如何解決MySQL深分頁問題MySql
- ElasticSearch第3篇 大資料處理3大問題(“10000條”問題解決方案、hits total值統計總數不精確解決方案、大資料深度分頁效能問題3種最佳化方案)Elasticsearch大資料
- 前端解決跨域問題總結前端跨域
- 使用awk和sed獲取檔案奇偶數行的方法總結
- 【BUG】鴻蒙模擬器虛擬化問題的解決方案鴻蒙