Spring Data JPA和分頁

讓我們從支持分頁的經典JPA方法開始。 考慮一個簡單的域類–一個具有名字,姓氏的“成員”。 為了支持在成員列表上進行分頁,JPA方法是支持一種查找器,該查找器將獲取第一個結果(firstResult)的偏移量和要檢索的結果(maxResults)的大小,方法是:

import java.util.List;import javax.persistence.TypedQuery;import org.springframework.stereotype.Repository;import mvcsample.domain.Member;@Repository
public class JpaMemberDao extends JpaDao<Long, Member> implements MemberDao{public JpaMemberDao(){super(Member.class);}@Overridepublic List<Member> findAll(int firstResult, int maxResults) {TypedQuery<Member> query = this.entityManager.createQuery('select m from Member m', Member.class);return query.setFirstResult(firstResult).setMaxResults(maxResults).getResultList();}@Overridepublic Long countMembers() {TypedQuery<Long> query = this.entityManager.createQuery('select count(m) from Member m', Long.class);return query.getSingleResult();}
}

如上所示,需要一個附加的API返回記錄的數量來確定實體列表的頁數。 使用此API,通常需要用戶界面提供兩個參數:

  • 當前顯示的頁面(例如“ page.page”)
  • 每頁列表的大小(例如“ page.size”)

控制器將負責通過以下方式將這些輸入轉換為JPA所需的輸入– firstResult和maxResults:

@RequestMapping(produces='text/html')
public String list(@RequestParam(defaultValue='1', value='page.page', required=false) Integer page, @RequestParam(defaultValue='10', value='page.size', required=false) Integer size, Model model){int firstResult = (page==null)?0:(page-1) * size;model.addAttribute('members',this.memberDao.findAll(firstResult, size));float nrOfPages = (float)this.memberDao.countMembers()/size;int maxPages = (int)( ((nrOfPages>(int)nrOfPages) || nrOfPages==0.0)?nrOfPages+1:nrOfPages);model.addAttribute('maxPages', maxPages);return 'members/list';
}

給定一個列表作為模型屬性和所有頁面的數量(上面的maxPages個),可以將該列表轉換為jsp中的一個簡單表,Spring Roo打包了一個不錯的標記庫,可用于顯示在jsp頁面中的分頁元素,我已將其包含在參考中。

因此,這是使用JPA和Spring MVC進行分頁的方法。 Spring-Data-JPA使這個過程變得更加簡單 ,首先是支持檢索分頁列表的存儲庫接口–以最簡單的形式,該存儲庫僅需要擴展Spring-Data-JPA接口,并在運行時生成實現真正JPA調用的代理:

import mvcsample.domain.Member;import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;public interface MemberRepository extends JpaRepository<Member, Long>{//
}

鑒于此,訪問存儲庫接口的控制器方法也非常簡單:

@RequestMapping(produces='text/html')
public String list(Pageable pageable, Model model){Page<Member> members = this.memberRepository.findAll(pageable);model.addAttribute('members', members.getContent());float nrOfPages = members.getTotalPages();model.addAttribute('maxPages', nrOfPages);return 'members/list';
}

控制器方法接受一個名為Pageable的參數,此參數使用Spring MVC HandlerMethodArgumentResolver填充,該MVC HandlerMethodArgumentResolver通過名稱“ page.page”和“ page.size”查找請求參數,并將其轉換為Pageable參數。 此自定義HandlerMethodArgumentResolver通過以下方式向Spring MVC注冊:

<mvc:annotation-driven><mvc:argument-resolvers><bean class='org.springframework.data.web.PageableArgumentResolver'></bean></mvc:argument-resolvers>
</mvc:annotation-driven>

JpaRepository API接受pageable參數并返回一個頁面,在內部自動填充也可以從Page方法檢索的頁面數。 如果需要顯式指定查詢,則可以采用多種方法來完成,其中一種方法如下:

@Query(value='select m from Member m', countQuery='select count(m) from Member m')
Page<Member> findMembers(Pageable pageable);

我可以看到的一個問題是,可分頁的頁面號是0索引,而從UI傳遞的那個是1索引,但是PageableArgumentResolver在內部處理并將1索引的UI頁面參數轉換為所需的0索引值。 因此,Spring Data JPA使實現分頁列表頁面變得非常簡單。 我包括一個將所有這些都聯系在一起的示例項目,以及使分頁列表顯示變得簡單的分頁標簽庫。

資源:

  • 實現分頁列表的示例項目位于此處 :https://github.com/bijukunjummen/spring-mvc-test-sample.git
  • Spring-Data-JPA參考 :http://static.springsource.org/spring-data/data-jpa/docs/current/reference/html/

參考資料: all和其他博客中的Spring Data JPA和我們的JCG合作伙伴 Biju Kunjummen的分頁 。

翻譯自: https://www.javacodegeeks.com/2013/01/spring-data-jpa-and-pagination.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370053.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370053.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370053.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

南陽理工 題目63 小猴子下落

小猴子下落 時間限制&#xff1a;3000 ms | 內存限制&#xff1a;65535 KB 難度&#xff1a;3 描述 有一顆二叉樹&#xff0c;最大深度為D,且所有葉子的深度都相同。所有結點從左到右從上到下的編號為1,2,3&#xff0c;&#xff0c;2的D次方減1。在結點1處放一個小猴子&#…

vue 方法獲取返回值_vue.js - vuex異步提交,怎么獲取返回數據

問 題 做登錄頁面時,在vuex中的action異步提交后獲取的數據在mutations中存儲在state里面,但是總感覺不對,沒有返回數據,我前端頁面怎么獲取數據,用mapgetter獲取不到數據,是不是他不是實時更新的,而且輸出的mapgetter輸出的數據還在action的前面。下面是我前端部分代碼…

Windows環境下安裝、卸載Apache

安裝Apache 服務 打開 Apcahe的目錄 &#xff0c;打開bin目錄&#xff0c; 如&#xff1a;E:\wamp\Apache24\bin &#xff0c;打開目錄&#xff0c;Shift鍵 鼠標右鍵 &#xff0c; 點擊 在此處打開命令窗口或者W快捷鍵直接到此處&#xff0c; 也可以Window鍵r&#xff0c;輸入…

css清浮動

我們在平常做項目的時候&#xff0c;float這個css屬性經常會用到。元素浮動會讓元素脫離文檔流&#xff0c;從而不能撐開父級的內容。今天我將展示常見的清除浮動的方法。 什么是浮動 浮動元素脫離文檔流并且向左或者向右移動&#xff0c;直到浮動元素的邊緣碰到父級框或者另…

小心緩存管理器

如果使用spring和JPA&#xff0c;則很有可能利用ehcache&#xff08;或其他緩存提供程序&#xff09;。 您可以在兩種不同的情況下進行此操作&#xff1a;JPA 2級緩存和spring方法緩存。 在配置應用程序時&#xff0c;通常會設置JPA提供程序的二級緩存提供程序&#xff08;在我…

DirectX11 學習筆記7 - 支持自由移動的攝像機

如今將又一次制定一個camera攝像機。能夠自由移動。比方前進 后退&#xff0c;上游 下潛。 各個方向渲染之類的。 首先設置按鍵。 這個時候須要在 XWindow.h 里面 bool XWindow::frame() {//推斷是否按下ESC鍵if(x_input->isKeyDown(VK_ESCAPE))return false;//假設A,S,D,W,…

騰訊吃雞 android,騰訊吃雞手游《光榮使命》正式上線:安卓/iOS不限號測試

IT之家11月29日消息 今天下午&#xff0c;騰訊首款百人戰術競技手游《光榮使命》在安卓、iOS雙平臺正式上線&#xff0c;開啟全面測試。(官網下載&#xff1a;點此鏈接&#xff0c;雙平臺已開放下載。)該游戲采用第三人稱射擊視角&#xff0c;玩家化身參與“使命行動”軍事演習…

lazada鋪貨模式的選品_lazada小白的運營難點→鋪貨與精細化運營的優劣勢詳解

lazada是鋪貨還是精細化經營第一種鋪貨鋪貨作為平臺早期都是比較受歡迎的&#xff0c;平臺的蠻荒期&#xff0c;成長期當中&#xff0c;鋪貨的商家是非常受歡迎的&#xff0c;因為平臺需要更多SKU產品&#xff0c;去吸引買家&#xff0c;鋪貨這個時候是最好的也是能最快的成長起…

ife 零基礎學院 day 2

第二天&#xff1a;給自己做一個在線簡歷吧 最后的驗證&#xff0c;提出了幾個問題&#xff0c;嘗試解答一下 HTML是什么&#xff0c;HTML5是什么 HTML的定義摘抄自w3school的HTML 簡介 HTML 是用來描述網頁的一種語言。 HTML 指的是超文本標記語言 (Hyper Text Markup Langua…

excel數據生成sql?insert語句

excel數據生成sql insert語句 excel表格中有A、B、C三列數據&#xff0c;希望導入到數據庫users表中&#xff0c;對應的字段分別是name,sex,age 。 在你的excel表格中增加一列&#xff0c;利用excel的公式自動生成sql語句&#xff0c;方法如下&#xff1a; 1、增加一列&#xf…

Java中的推斷異常

借用和竊取其他語言的概念和想法總是很高興的。 Scala的Option是我真正喜歡的一個主意&#xff0c;因此我用Java編寫了一個實現。 它包裝了一個可能為null或不為null的對象&#xff0c;并提供了一些可按某種功能使用的方法。 例如&#xff0c;isDefined方法添加了一種面向對象的…

重載,覆蓋,隱藏

轉載于:https://www.cnblogs.com/jhcelue/p/7145525.html

Animate.css介紹

Animate.css簡介 animate.css 動畫庫&#xff0c;預設了抖動&#xff08;shake&#xff09;、閃爍&#xff08;flash&#xff09;、彈跳&#xff08;bounce&#xff09;、翻轉&#xff08;flip&#xff09;、旋轉&#xff08;rotateIn/rotateOut&#xff09;、淡入淡出&#x…

logstash 吞吐量優化_1002-談談ELK日志分析平臺的性能優化理念

在生產環境中&#xff0c;我們為了更好的服務于業務&#xff0c;通常會通過優化的手段來實現服務對外的性能最大化&#xff0c;節省系統性能開支&#xff1b;關注我的朋友們都知道&#xff0c;前段時間一直在搞ELK&#xff0c;同時也記錄在了個人的博客篇章中&#xff0c;從部署…

spark SQL(三)數據源 Data Source----通用的數據 加載/保存功能

Spark SQL 的數據源------通用的數據 加載/保存功能 Spark SQL支持通過DataFrame接口在各種數據源上進行操作。DataFrame可以使用關系變換進行操作&#xff0c;也可以用來創建臨時視圖。將DataFrame 注冊為臨時視圖允許您對其數據運行SQL查詢。本節介紹使用Spark Data Sou…

sqlserver日期函數

SQLServer時間日期函數詳解,SQLServer,時間日期, 1. 當前系統日期、時間 select getdate() 2. dateadd 在向指定日期加上一段時間的基礎上&#xff0c;返回新的 datetime 值 例如&#xff1a;向日期加上2天 select dateadd(day,2,2004-10-15) --返回&#xff1a…

榮耀鴻蒙系統開機動畫,榮耀趙明:鴻蒙系統首發設備欲屏蔽開機廣告

來源&#xff1a;硅谷分析獅余承東表示8月9日會發布鴻蒙系統&#xff0c;而從他透露的一些細節看&#xff0c;鴻蒙系統將首先運用在智慧屏終端上&#xff0c;其配合大屏幕和自研芯片(麒麟AI芯片&#xff0c;鴻鵠智慧顯示芯片&#xff0c;凌霄WIFI芯片)&#xff0c;將實現生態上…

編寫Maven插件的提示

最近&#xff0c;我花了很多時間來編寫或為Maven開發插件。 它們簡單&#xff0c;有趣且有趣。 我以為我會分享一些技巧&#xff0c;使他們在編寫時變得更輕松。 提示1&#xff1a;將任務與Mojo分開 最初&#xff0c;您將把mojo的所有代碼放入mojo的類&#xff08;即&#xf…

oracle通信通道的文件結尾_ORA-03113:通信通道的文件結尾解決

提示ORA-03113&#xff1a;通信通道的文件結尾解決事情原由&#xff1a;oracle安裝到win7下&#xff0c;以為都是直接sqlplus / as sysdba&#xff0c;使用數據庫&#xff0c;但最近連接時頻繁報錯&#xff0c;提示ORA-03113&#xff1a;通信通道的文件結尾進程 ID &#xff1a…

Python_迭代器與生成器

迭代器 迭代是Python最強大的功能之一&#xff0c;是訪問集合元素的一種方式。。 迭代器是一個可以記住遍歷的位置的對象。 迭代器對象從集合的第一個元素開始訪問&#xff0c;直到所有的元素被訪問完結束。迭代器只能往前不會后退。 迭代器有兩個基本的方法&#xff1a;iter()…