日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring Data Solr教程:分页

發(fā)布時間:2023/12/3 javascript 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring Data Solr教程:分页 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在我的Spring Data Solr教程的較早部分中,我們實(shí)現(xiàn)了一個簡單的搜索功能,該功能用于搜索待辦事項(xiàng)的信息。 我們搜索功能的當(dāng)前實(shí)現(xiàn)將所有搜索結(jié)果顯示在一個頁面中。 對于大多數(shù)現(xiàn)實(shí)生活中的應(yīng)用程序而言,這不是可行的解決方案,因?yàn)樗阉鹘Y(jié)果的數(shù)量可能太大,以致搜索功能不再可用。

這篇博客文章描述了如何使用Spring Data Solr對查詢結(jié)果或搜索功能進(jìn)行分頁,從而為我們提供了解決該問題的方法。

這篇博客文章分為五個部分:

  • 第一部分描述了如何手動請求正確的頁面,并討論了查詢方法的不同返回類型。
  • 第二部分描述了如何通過向存儲庫中添加自定義方法來獲取搜索結(jié)果計數(shù)。
  • 第三部分介紹了如何對查詢方法的搜索結(jié)果進(jìn)行分頁。
  • 第四部分教我們?nèi)绾螌討B(tài)查詢的搜索結(jié)果進(jìn)行分頁。
  • 第五部分也是最后一部分描述了如何配置和使用一種稱為Web分頁的技術(shù)。

注意 :這些博客文章提供了其他信息,可幫助我們理解此博客文章中描述的概念:

  • 使用Maven運(yùn)行Solr
  • Spring Data Solr教程:Solr簡介
  • Spring Data Solr教程:配置
  • Spring Data Solr教程CRUD(幾乎)
  • Spring Data Solr教程:將自定義方法添加到單個存儲庫
  • Spring Data Solr教程:動態(tài)查詢
  • Spring Data Solr教程:排序

讓我們開始吧。

理論紀(jì)要

在開始對示例應(yīng)用程序進(jìn)行修改之前,我們將簡要介紹分頁背后的理論。 本節(jié)分為兩個小節(jié),如下所述:

  • 第一部分描述了如何指定查詢的分頁選項(xiàng)。
  • 第二部分描述查詢方法的不同返回類型。

讓我們繼續(xù)。

指定想要的頁面

使用的分頁選項(xiàng)是通過使用實(shí)現(xiàn)Pageable接口的PageRequest類指定的。

以下是典型的分頁要求:

  • 獲取屬于單個頁面的查詢結(jié)果。
  • 使用單個字段的值對查詢結(jié)果進(jìn)行排序時,獲取屬于單個頁面的查詢結(jié)果。
  • 使用多個字段的值對查詢結(jié)果進(jìn)行排序并且不同字段的排序順序相同時,獲取屬于單個頁面的查詢結(jié)果。
  • 使用多個字段的值對查詢結(jié)果進(jìn)行排序并且不同字段的排序順序不同時,獲取屬于單個頁面的查詢結(jié)果。

讓我們找出如何創(chuàng)建滿足給定要求的PageRequest對象。

首先,我們必須創(chuàng)建一個PageRequest對象,該對象指定我們要獲取屬于單個頁面的查詢結(jié)果。 我們可以使用以下代碼創(chuàng)建PageRequest對象:

//Get the query results belonging to the first page when page size is 10. new PageRequest(0, 10)

其次,我們必須創(chuàng)建一個PageRequest對象,該對象指定當(dāng)使用單個字段的值對查詢結(jié)果進(jìn)行排序時,我們希望獲得屬于單個頁面的結(jié)果。 我們可以使用以下代碼創(chuàng)建PageRequest對象:

/Gets the query results belonging to the first page when page size is 10. //Query results are sorted in descending order by using id field. new PageRequest(0, 10 Sort.Direction.DESC, "id")

第三,我們必須創(chuàng)建一個PageRequest對象,該對象指定當(dāng)使用多個字段對查詢結(jié)果進(jìn)行排序并且不同字段的排序順序相同時,我們希望獲取屬于單個頁面的結(jié)果。 我們可以使用以下代碼創(chuàng)建PageRequest對象:

//Gets the query results belonging to the first page when page size is 10. //Query results are sorted in descending order by using id and description fields. new PageRequest(0, 10 Sort.Direction.DESC, "id", "description")

第四,我們必須創(chuàng)建一個PageRequest對象,該對象指定當(dāng)使用多個字段對查詢結(jié)果進(jìn)行排序并且不同字段的排序順序不同時,要獲取屬于單個頁面的查詢結(jié)果。 我們可以使用以下代碼創(chuàng)建該對象:

//Gets the query results belonging to the first page when page size is 10. //Query results are sorted in descending order order by using the description field //and in ascending order by using the id field. Sort sort = new Sort(Sort.Direction.DESC, "description").and(new Sort(Sort.Direction.ASC, "id")) new PageRequest(0, 10, sort);

現(xiàn)在我們知道如何創(chuàng)建新的PageRequest對象。 讓我們繼續(xù)討論查詢方法的不同返回類型。

確定查詢方法的返回類型

當(dāng)查詢方法使用分頁時,它可以具有兩種返回類型。 這些返回類型將在下面進(jìn)行描述(我們將假定模型類的名稱為TodoDocument ):

  • 當(dāng)我們對分頁元數(shù)據(jù)感興趣時,查詢方法的返回類型必須為Page <TodoDocument> (獲取有關(guān)Page接口的更多信息,該接口聲明用于獲取分頁元數(shù)據(jù)的方法)。
  • 當(dāng)我們對分頁元數(shù)據(jù)不感興趣時??,查詢方法的返回類型應(yīng)為List <TodoDocument> 。

獲取搜索結(jié)果計數(shù)

在開始對查詢的搜索結(jié)果進(jìn)行分頁之前,我們必須實(shí)現(xiàn)一個函數(shù),該函數(shù)用于獲取與給定搜索條件匹配的待辦事項(xiàng)條目數(shù)。 此數(shù)字是必需的,以便我們可以在前端實(shí)現(xiàn)分頁邏輯。

我們可以按照以下步驟實(shí)現(xiàn)此功能:

  • 將自定義方法添加到我們的存儲庫。 此方法用于返回搜索結(jié)果計數(shù)。
  • 使用我們的自定義存儲庫方法創(chuàng)建一個新的服務(wù)方法。
  • 在以下小節(jié)中將更詳細(xì)地描述這些步驟。

    向我們的存儲庫添加自定義方法

    目前,如果不向存儲庫中添加自定義方法,就無法創(chuàng)建計數(shù)查詢。 我們可以按照以下步驟進(jìn)行操作:

  • 創(chuàng)建一個定制的存儲庫界面。
  • 實(shí)現(xiàn)定制存儲庫接口。
  • 修改實(shí)際的存儲庫界面。
  • 讓我們繼續(xù)前進(jìn),找出實(shí)現(xiàn)方法。

    創(chuàng)建自定義存儲庫界面

    我們可以按照以下步驟創(chuàng)建自定義存儲庫接口:

  • 創(chuàng)建一個名為CustomTodoDocumentRepository的接口。
  • 將count()方法添加到創(chuàng)建的接口。 該方法將使用的搜索詞作為方法參數(shù)。
  • CustomTodoDocumentRepository接口的源代碼如下所示:

    public interface CustomTodoDocumentRepository {public long count(String searchTerm);//Other methods are omitted }

    實(shí)施自定義存儲庫界面

    我們可以按照以下步驟實(shí)現(xiàn)自定義存儲庫接口:

  • 創(chuàng)建一個名為TodoDocumentRepositoryImpl的類,并實(shí)現(xiàn)CustomTodoDocumentRepository接口。
  • 用@Repository批注對類進(jìn)行批注。
  • 將SolrTemplate字段添加到類中,并使用@Resource注釋對字段進(jìn)行注釋。
  • 實(shí)現(xiàn)count()方法。
  • 讓我們仔細(xì)看一下count()方法的實(shí)現(xiàn)。 我們可以通過執(zhí)行以下步驟來實(shí)現(xiàn)此方法:

  • 獲取給定搜索詞的單詞。
  • 通過調(diào)用私有的constructSearchConditions()方法來構(gòu)造使用的搜索條件,并將搜索詞的單詞作為方法參數(shù)傳遞。
  • 通過創(chuàng)建新的SimpleQuery對象來創(chuàng)建執(zhí)行的查詢,并將創(chuàng)建的Criteria對象作為構(gòu)造函數(shù)參數(shù)傳遞。
  • 通過調(diào)用SolrTemplate類的count()方法獲取搜索結(jié)果計數(shù),并將創(chuàng)建的SimpleQuery對象作為方法參數(shù)傳遞。
  • 返回搜索結(jié)果計數(shù)。
  • TodoDocumentRepositoryImpl類的源代碼如下所示:

    import org.springframework.data.solr.core.SolrTemplate; import org.springframework.data.solr.core.query.Criteria; import org.springframework.data.solr.core.query.SimpleQuery; import org.springframework.stereotype.Repository;import javax.annotation.Resource;@Repository public class TodoDocumentRepositoryImpl implements CustomTodoDocumentRepository {@Resourceprivate SolrTemplate solrTemplate;@Overridepublic long count(String searchTerm) {String[] words = searchTerm.split(" ");Criteria conditions = createSearchConditions(words);SimpleQuery countQuery = new SimpleQuery(conditions);return solrTemplate.count(countQuery);}private Criteria createSearchConditions(String[] words) {Criteria conditions = null;for (String word: words) {if (conditions == null) {conditions = new Criteria("title").contains(word).or(new Criteria("description").contains(word));}else {conditions = conditions.or(new Criteria("title").contains(word)).or(new Criteria("description").contains(word));}}return conditions;}//Other methods are omitted. }

    修改實(shí)際存儲庫界面

    通過擴(kuò)展CustomTodoRepositoryInterface,我們可以使自定義count()方法對我們的存儲庫用戶可見。 TodoDocumentRepository的源代碼如下所示:

    public interface TodoDocumentRepository extends CustomTodoRepository, SolrCrudRepository<TodoDocument, String> {//Repository methods are omitted. }

    使用自定義存儲庫方法

    我們可以按照以下步驟使用創(chuàng)建的存儲庫方法:

  • 修改TodoIndexService接口。
  • 實(shí)現(xiàn)修改后的接口。
  • 下面將更詳細(xì)地描述這些步驟。

    注意 :我們還必須進(jìn)行其他更改,但是由于它們與Spring Data Solr不相關(guān),因此在此不再贅述。

    修改服務(wù)接口

    我們必須通過向其添加一個新的countSearchResults()方法來修改TodoIndexService接口。 此方法將使用的搜索詞作為方法參數(shù),并返回搜索結(jié)果計數(shù)。 TodoIndexService接口的源代碼如下所示:

    public interface TodoIndexService {public long countSearchResults(String searchTerm);//Other methods are omitted. }

    實(shí)施修改后的接口

    通過執(zhí)行以下步驟,我們可以實(shí)現(xiàn)countSearchResults()方法:

  • 將countSearchResults()方法添加到RepositoryTodoIndexService類。
  • 通過調(diào)用自定義存儲庫方法獲取搜索結(jié)果計數(shù),然后返回搜索結(jié)果計數(shù)。
  • RepositoryTodoIndexService類的相關(guān)部分如下所示:

    import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional;import javax.annotation.Resource; import java.util.ArrayList; import java.util.List;@Service public class RepositoryTodoIndexService implements TodoIndexService {@Resourceprivate TodoDocumentRepository repository;@Overridepublic long countSearchResults(String searchTerm) {return repository.count(searchTerm);}//Other methods are omitted. }

    分頁查詢方法的查詢結(jié)果

    使用查詢方法創(chuàng)建查詢時,可以按照以下步驟對查詢結(jié)果進(jìn)行分頁:

  • 將新的Pageable參數(shù)添加到查詢方法。 此參數(shù)指定獲取的頁面的詳細(xì)信息。
  • 通過將新的Pageable參數(shù)添加到TodoIndexService接口的search()方法來修改服務(wù)層。
  • 讓我們開始吧。

    修改存儲庫界面

    我們可以通過向查詢方法添加Pageable參數(shù)來向我們的存儲庫添加分頁支持,該方法用于構(gòu)建執(zhí)行的查詢。 讓我們看一下查詢方法的聲明。

    從方法名稱查詢生成

    通過使用從方法名策略生成查詢來創(chuàng)建執(zhí)行的查詢時,我們必須向TodoDocumentRepository接口的findByTitleContainsOrDescriptionContains()方法添加Pageable參數(shù)。 我們的存儲庫界面的這些源代碼如下所示:

    import org.springframework.data.domain.Pageable; import org.springframework.data.solr.repository.SolrCrudRepository;import java.util.List;public interface TodoDocumentRepository extends CustomTodoDocumentRepository, SolrCrudRepository<TodoDocument, String> {public List<TodoDocument> findByTitleContainsOrDescriptionContains(String title, String description, Pageable page); }

    命名查詢

    使用命名查詢時,我們必須在TodoDocumentRepository接口的findByNamedQuery()方法中添加Pageable參數(shù)。 TodoDocumentRepository接口的源代碼如下所示:

    import org.springframework.data.domain.Pageable; import org.springframework.data.solr.repository.Query; import org.springframework.data.solr.repository.SolrCrudRepository;import java.util.List;public interface TodoDocumentRepository extends CustomTodoDocumentRepository, SolrCrudRepository<TodoDocument, String> {@Query(name = "TodoDocument.findByNamedQuery")public List<TodoDocument> findByNamedQuery(String searchTerm, Pageable page); }

    @Query注釋

    使用@Query批注創(chuàng)建執(zhí)行的查詢時,我們必須在TodoDocumentRepository接口的findByQueryAnnotation()方法中添加Pageable參數(shù)。 我們的存儲庫界面的源代碼如下所示:

    import org.springframework.data.domain.Pageable; import org.springframework.data.solr.repository.Query; import org.springframework.data.solr.repository.SolrCrudRepository;import java.util.List;public interface TodoDocumentRepository extends CustomTodoDocumentRepository, SolrCrudRepository<TodoDocument, String> {@Query("title:*?0* OR description:*?0*")public List<TodoDocument> findByQueryAnnotation(String searchTerm, Pageable page); }

    修改服務(wù)層

    我們必須對示例應(yīng)用程序的服務(wù)層進(jìn)行以下修改:

  • 將一個Pageable參數(shù)添加到TodoIndexService接口的search()方法。
  • 實(shí)現(xiàn)新的search()方法。
  • 注意 :我們還必須進(jìn)行其他更改,但是由于它們與Spring Data Solr不相關(guān),因此在此不再贅述。

    TodoIndexService接口的源代碼如下所示:

    import org.springframework.data.domain.Pageable; import java.util.List;public interface TodoIndexService {public List<TodoDocument> search(String searchTerm, Pageable page);//Other methods are omitted. }

    我們可以通過對RepositoryIndexService類的search()方法進(jìn)行以下更改來使用修改后的查詢方法:

  • 通過調(diào)用存儲庫的查詢方法來獲取分頁查詢結(jié)果,并將使用的搜索詞和Pageable對象作為方法參數(shù)傳遞。
  • 返回查詢結(jié)果。
  • 讓我們來看一下search()方法的不同實(shí)現(xiàn)。

    從方法名稱查詢生成

    通過使用從方法名策略生成查詢來構(gòu)建查詢時,可以使用TodoDocumentRepository接口的findByTitleContainsOrDescriptionContains()方法獲取屬于特定頁面的查詢結(jié)果。

    RepositoryTodoIndexService類的相關(guān)部分如下所示:

    import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional;import javax.annotation.Resource; import java.util.ArrayList; import java.util.List;@Service public class RepositoryTodoIndexService implements TodoIndexService {@Resourceprivate TodoDocumentRepository repository;@Overridepublic List<TodoDocument> search(String searchTerm, Pageable page) {return repository.findByTitleContainsOrDescriptionContains(searchTerm, searchTerm, page);}//Other methods are omitted }

    命名查詢

    當(dāng)我們使用命名查詢來構(gòu)建執(zhí)行的查詢時,可以使用TodoDocumentRepository接口的findByNamedQuery()方法獲取屬于特定頁面的搜索結(jié)果。

    RepositoryTodoIndexService類的相關(guān)部分如下所示:

    import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional;import javax.annotation.Resource; import java.util.ArrayList; import java.util.List;@Service public class RepositoryTodoIndexService implements TodoIndexService {@Resourceprivate TodoDocumentRepository repository;@Overridepublic List<TodoDocument> search(String searchTerm, Pageable page) {return repository.findByNamedQuery(searchTerm, page);}//Other methods are omitted }

    @Query注釋

    使用@Query批注構(gòu)建查詢時,可以通過調(diào)用TodoDocumentRepository接口的findByQueryAnnotation()方法來獲取屬于特定頁面的搜索結(jié)果。

    RepositoryTodoIndexService類的源代碼如下所示:

    import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional;import javax.annotation.Resource; import java.util.ArrayList; import java.util.List;@Service public class RepositoryTodoIndexService implements TodoIndexService {@Resourceprivate TodoDocumentRepository repository;@Overridepublic List<TodoDocument> search(String searchTerm, Pageable page) {return repository.findByQueryAnnotation(searchTerm, page);}//Other methods are omitted }

    分頁動態(tài)查詢的查詢結(jié)果

    我們可以按照以下步驟對動態(tài)查詢的查詢結(jié)果進(jìn)行分頁:

  • 將Pageable參數(shù)添加到我們的自定義存儲庫的search()方法中。
  • 通過將Pageable參數(shù)添加到TodoIndexService接口的search()方法來修改服務(wù)層。
  • 在以下小節(jié)中將更詳細(xì)地描述這些步驟。

    更改自定義存儲庫

    我們必須向我們的自定義存儲庫添加分頁支持。 我們可以按照以下步驟進(jìn)行操作:

  • 通過將Pageable參數(shù)添加到其search()方法來修改自定義存儲庫接口。
  • 通過向其添加分頁支持來更改search()方法的實(shí)現(xiàn)。
  • 讓我們繼續(xù)前進(jìn),找出實(shí)現(xiàn)方法。

    更改自定義存儲庫界面

    我們必須在CustomTodoDocumentRepository接口中聲明的search()方法中添加Pageable參數(shù)。 我們的自定義存儲庫界面的源代碼如下所示:

    import org.springframework.data.domain.Pageable;import java.util.List;public interface CustomTodoDocumentRepository {public List<TodoDocument> search(String searchTerm, Pageable page);//Other methods are omitted. }

    實(shí)施自定義存儲庫方法

    我們的下一步是向search()方法的實(shí)現(xiàn)中添加分頁支持。 通過執(zhí)行以下步驟,我們可以實(shí)現(xiàn)TodoDocumentRepositoryImpl類的search()方法:

  • 獲取搜索詞的單詞。
  • 通過調(diào)用私有createSearchConditions()方法并將搜索詞的單詞作為方法參數(shù)來構(gòu)造使用的搜索條件。
  • 通過創(chuàng)建新的SimpleQuery對象來創(chuàng)建執(zhí)行的查詢,并將創(chuàng)建的Criteria對象作為構(gòu)造函數(shù)參數(shù)傳遞。
  • 通過調(diào)用SimpleQuery類的setPageRequest()方法來設(shè)置查詢的分頁選項(xiàng)。 將Pageable對象作為方法參數(shù)傳遞。
  • 通過調(diào)用SolrTemplate類的queryForPage()方法獲取搜索結(jié)果。 將創(chuàng)建的查詢和期望的返回對象的類型作為方法參數(shù)傳遞。
  • 通過調(diào)用Page接口的getContent()方法來返回搜索結(jié)果。
  • TodoDocumentRepositoryImpl類的源代碼如下所示:

    import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.solr.core.SolrTemplate; import org.springframework.data.solr.core.query.Criteria; import org.springframework.data.solr.core.query.SimpleQuery; import org.springframework.stereotype.Repository;import javax.annotation.Resource; import java.util.ArrayList; import java.util.List;@Repository public class TodoDocumentRepositoryImpl implements CustomTodoDocumentRepository {@Resourceprivate SolrTemplate solrTemplate;@Overridepublic List<TodoDocument> search(String searchTerm, Pageable page) {String[] words = searchTerm.split(" ");Criteria conditions = createSearchConditions(words);SimpleQuery search = new SimpleQuery(conditions);search.setPageRequest(page);Page results = solrTemplate.queryForPage(search, TodoDocument.class);return results.getContent();}private Criteria createSearchConditions(String[] words) {Criteria conditions = null;for (String word: words) {if (conditions == null) {conditions = new Criteria("title").contains(word).or(new Criteria("description").contains(word));}else {conditions = conditions.or(new Criteria("title").contains(word)).or(new Criteria("description").contains(word));}}return conditions;}//Other methods are omitted. }

    使用自定義存儲庫

    在使用修改后的存儲庫方法之前,我們必須對示例應(yīng)用程序的服務(wù)層進(jìn)行以下更改:

  • 將一個Pageable參數(shù)添加到TodoIndexService接口的search()方法。
  • 實(shí)現(xiàn)search()方法。
  • 下面將更詳細(xì)地描述這些步驟。

    注意 :我們還必須進(jìn)行其他更改,但是由于它們與Spring Data Solr不相關(guān),因此在此不再贅述。

    修改服務(wù)接口

    我們必須向TodoIndexService接口的search()方法添加Pageable參數(shù)。 TodoIndexService的源代碼如下所示:

    import org.springframework.data.domain.Pageable; import java.util.List;public interface TodoIndexService {public List<TodoDocument> search(String searchTerm, Pageable page);//Other methods are omitted. }

    實(shí)施服務(wù)接口

    當(dāng)使用Spring Data Solr的標(biāo)準(zhǔn)API進(jìn)行構(gòu)建時,我們可以通過調(diào)用自定義存儲庫的search()方法并將用戶搜索詞和Pageable對象作為方法參數(shù)來獲取查詢結(jié)果。

    RepositoryTodoIndexService類的源代碼如下所示:

    import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.List;@Service public class RepositoryTodoIndexService implements TodoIndexService {@Resourceprivate TodoDocumentRepository repository;@Overridepublic List<TodoDocument> search(String searchTerm, Pageable page) {return repository.search(searchTerm, page);}//Other methods are omitted. }

    使用網(wǎng)頁分頁

    一個問題仍然沒有答案。 問題是:

    在何處指定用于對查詢的查詢結(jié)果進(jìn)行分頁的分頁選項(xiàng)?

    我們將使用稱為Web pagination的技術(shù)來創(chuàng)建查詢的分頁選項(xiàng)。 此技術(shù)基于稱為PageableArgumentResolver的自定義參數(shù)解析器類。 此類解析來自HTTP請求的分頁信息,并使向控件方法添加Pageable方法參數(shù)成為可能。

    本節(jié)描述了如何在示例應(yīng)用程序中配置和使用此技術(shù)。 它分為三個小節(jié):

    • 第一部分描述了如何配置PageableArgumentResolver類。
    • 第二小節(jié)介紹了如何使用它。
    • 最后一個小節(jié)討論了Web分頁的利弊。

    讓我們找出如何在示例應(yīng)用程序中使用此技術(shù)。

    組態(tài)

    本小節(jié)描述了如何配置PageableArgumentResolver類,該類將用于從HTTP請求中提取分頁選項(xiàng)。 讓我們找出如何通過使用Java配置和XML配置來做到這一點(diǎn)。

    Java配置

    我們可以通過對ExampleApplicationContext類進(jìn)行以下更改來添加自定義參數(shù)自變量解析器:

  • 重寫WebMvcConfigurerAdapter類的addArgumentResolvers()方法。
  • 通過創(chuàng)建新的PageableArgumentResolver對象并將創(chuàng)建的對象添加到作為方法參數(shù)給出的參數(shù)解析器列表中,實(shí)現(xiàn)addArgumentResolvers()方法。
  • ExampleApplicationContext類的相關(guān)部分如下所示:

    import org.springframework.data.web.PageableArgumentResolver; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import org.springframework.web.servlet.mvc.method.annotation.ServletWebArgumentResolverAdapter;import java.util.List;//Annotations are omitted. public class ExampleApplicationContext extends WebMvcConfigurerAdapter {@Overridepublic void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {PageableArgumentResolver pageableArgumentResolver = new PageableArgumentResolver();argumentResolvers.add(new ServletWebArgumentResolverAdapter(pageableArgumentResolver));}//Other methods are omitted. }

    XML配置

    我們可以通過對exampleApplicationContext.xml文件進(jìn)行以下更改來配置自定義參數(shù)解析程序:

  • 使用mvc命名空間的arguments-resolvers元素配置自定義參數(shù)解析器。
  • 在arguments-resolvers元素內(nèi)配置PageableArgumentResolver bean。
  • exampleApplicationContext.xml文件的相關(guān)部分如下所示:

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd"><mvc:annotation-driven><mvc:argument-resolvers><bean id="pageagleArgumentResolver" class="org.springframework.data.web.PageableArgumentResolver"/></mvc:argument-resolvers></mvc:annotation-driven><!-- Configuration is omitted. --> </beans>

    用法

    使用前面介紹的方法之一配置PageableArgumentResolver類后,可以將Pageable方法參數(shù)添加到控制器方法中。 TodoController類的search()方法就是一個很好的例子。 其源代碼的相關(guān)部分如下所示:

    import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*;import javax.annotation.Resource; import java.util.List;@Controller public class TodoController {//Fields are omitted.@RequestMapping(value = "/api/todo/search/{searchTerm}", method = RequestMethod.GET)@ResponseBodypublic List<TodoDTO> search(@PathVariable("searchTerm") String searchTerm, Pageable page) {//Implementation is omitted.}//Other methods are omitted. }

    但是,將Pageable參數(shù)添加到controller方法還不夠。 我們?nèi)匀槐仨殞⒎猪撨x項(xiàng)添加到HTTP請求。 這是通過在請求中添加特殊的請求參數(shù)來完成的。 這些請求參數(shù)描述如下:

    • page.page request參數(shù)指定所請求的頁面。
    • page.size請求參數(shù)指定頁面大小。
    • page.sort請求參數(shù)指定用于對查詢結(jié)果進(jìn)行排序的屬性。
    • page.sort.dir請求參數(shù)指定排序順序。

    讓我們花點(diǎn)時間思考一下Web分頁的利弊。

    利弊

    在決定在我們的應(yīng)用程序中使用它之前,我們應(yīng)該意識到Web分頁的優(yōu)缺點(diǎn)。 讓我們找出它們是什么。

    優(yōu)點(diǎn)

    使用網(wǎng)頁分頁有一個主要好處:

    將分頁選項(xiàng)從Web層轉(zhuǎn)移到存儲庫層是一件容易的事。 我們要做的就是配置自定義參數(shù)解析器,將Pageable參數(shù)添加到控制器方法,并使用特定的請求參數(shù)發(fā)送分頁選項(xiàng)。 這比處理代碼中的分頁選項(xiàng)和手動創(chuàng)建PageRequest對象要簡單得多。

    缺點(diǎn)

    下面介紹了使用Web分頁的缺點(diǎn):

    • Web分頁在Web層和Spring Data之間創(chuàng)建依賴關(guān)系。 這意味著存儲庫層的實(shí)現(xiàn)細(xì)節(jié)會泄漏到應(yīng)用程序的上層。 盡管純粹主義者可能會聲稱這是一個巨大的錯誤,但我不同意他們的觀點(diǎn)。 我認(rèn)為抽象應(yīng)該使我們的生活更輕松,而不是更艱難。 我們還必須記住, 泄漏抽象定律規(guī)定,所有非平凡抽象在某種程度上都是泄漏的。
    • Web分頁的一個真正的缺點(diǎn)是,只有在使用單個字段對搜索結(jié)果進(jìn)行排序的情況下,我們才能使用它。 盡管對于大多數(shù)用例來說這是完全可以的,但在某些情況下這會成為問題。 如果發(fā)生這種情況,我們必須手動處理分頁選項(xiàng)。

    摘要

    現(xiàn)在,我們已將分頁搜索結(jié)果添加到示例應(yīng)用程序中。 本教程教會了我們以下內(nèi)容:

    • 我們學(xué)習(xí)了創(chuàng)建新的PageRequest對象。
    • 我們了解到可以從兩個不同的選項(xiàng)中選擇查詢方法的返回類型。
    • 我們學(xué)習(xí)了對查詢方法和動態(tài)查詢的查詢結(jié)果進(jìn)行分頁。
    • 我們知道如何使用網(wǎng)頁分頁,并且知道它的優(yōu)缺點(diǎn)。

    我的Spring Data Solr教程的下一部分描述了如何向所有Spring Data Solr存儲庫添加自定義方法。

    PS此博客文章的示例應(yīng)用程序可在Github上獲得( 查詢方法和動態(tài)查詢 )。

    參考: Spring Data Solr教程: Petri Kainulainen博客上我們JCG合作伙伴 Petri Kainulainen的分頁 。

    翻譯自: https://www.javacodegeeks.com/2013/05/spring-data-solr-tutorial-pagination.html

    總結(jié)

    以上是生活随笔為你收集整理的Spring Data Solr教程:分页的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。