Spring Data JPA實(shí)現(xiàn)排序與分頁查詢超詳細(xì)流程講解
前言
在實(shí)際開發(fā)場景中,排序與分頁查詢是必須的,幸運(yùn)的是Spring Data JPA充分考慮了排序與分頁查詢的場景,為我們提供Sort類 Page接口 Pageable接口 下面通過一個實(shí)戰(zhàn)來闡明
1、創(chuàng)建持久化實(shí)體類
創(chuàng)建名為com.ch.ch6_4.entity的包 并在該包中創(chuàng)建名為Article和Author的持久化實(shí)體類
代碼如下
Article
package com.ch.ch6_2.entity; import java.io.Serializable; import javax.persistence.Basic; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.Lob; import javax.persistence.ManyToOne; import javax.persistence.Table; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.Size; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @Entity @Table(name = "article_table") @JsonIgnoreProperties(value = { "hibernateLazyInitializer"}) public class Article implements Serializable{ private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; //標(biāo)題 @NotEmpty(message = "標(biāo)題不能為空") @Size(min = 2, max = 50) @Column(nullable = false, length = 50) private String title; //文章內(nèi)容 @Lob //大對象,映射 為MySQL的Long文本類型 @Basic(fetch = FetchType.LAZY) @NotEmpty(message = "內(nèi)容不能為空") @Size(min = 2) @Column(nullable = false) private String content; //所屬作者,文章與作者是多對一的關(guān)系 @ManyToOne(cascade={CascadeType.MERGE,CascadeType.REFRESH},optional=false) //可選屬性optional=false,表示author不能為空。刪除文章,不影響用戶 @JoinColumn(name="id_author_id")//設(shè)置在article表中的關(guān)聯(lián)字段(外鍵) @JsonIgnore private Author author; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public Author getAuthor() { return author; } public void setAuthor(Author author) { this.author = author; } }
Author
package com.ch.ch6_2.entity; import java.io.Serializable; import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.OneToMany; import javax.persistence.Table; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @Entity @Table(name = "author_table") @JsonIgnoreProperties(value = { "hibernateLazyInitializer"}) public class Author implements Serializable{ private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; //作者名 private String aname; //文章列表,作者與文章是一對多的關(guān)系 @OneToMany( mappedBy = "author", cascade=CascadeType.ALL, targetEntity = Article.class, fetch=FetchType.LAZY ) private List<Article> articleList; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getAname() { return aname; } public void setAname(String aname) { this.aname = aname; } public List<Article> getArticleList() { return articleList; } public void setArticleList(List<Article> articleList) { this.articleList = articleList; } }
2、創(chuàng)建數(shù)據(jù)訪問層
創(chuàng)建名為com.ch.ch6_4repository的包 并在該包中創(chuàng)建名為AuthorRepository的接口
package com.ch.ch6_2.repository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import com.ch.ch6_2.entity.Author; public interface AuthorRepository extends JpaRepository<Author, Integer>{ /** * 根據(jù)文章標(biāo)題包含的內(nèi)容,查詢作者(關(guān)聯(lián)查詢) * 相當(dāng)于JPQL語句:select a from Author a inner join a.articleList t where t.title like %?1% */ public Author findByArticleList_titleContaining(String title); /** * 根據(jù)文章標(biāo)題包含的內(nèi)容,查詢作者(關(guān)聯(lián)查詢) */ @Query("select a from Author a inner join a.articleList t where t.title like %?1%" ) public Author findAuthorByArticleListtitleContaining(String title); }
3、創(chuàng)建業(yè)務(wù)層
創(chuàng)建名為com.ch.ch6_4.service的包 并在該包中創(chuàng)建名為ArticleAndAuthorService的接口和接口實(shí)現(xiàn)類ArticleAndAuthorServiceImpl
接口
package com.ch.ch6_2.service; import java.util.List; import com.ch.ch6_2.entity.Article; import com.ch.ch6_2.entity.Author; public interface AuthorAndArticleService { public void saveAll(); public List<Article> findByAuthor_id(Integer id); public List<Article> findByAuthor_aname(String aname); public Author findByArticleList_titleContaining(String title); public Author findAuthorByArticleListtitleContaining(String title); }
接口實(shí)現(xiàn)類
package com.ch.ch6_2.service; import java.util.ArrayList; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ch.ch6_2.entity.Article; import com.ch.ch6_2.entity.Author; import com.ch.ch6_2.repository.ArticleRepository; import com.ch.ch6_2.repository.AuthorRepository; @Service public class AuthorAndArticleServiceImpl implements AuthorAndArticleService{ @Autowired private AuthorRepository authorRepository; @Autowired private ArticleRepository articleRepository; @Override public void saveAll() { //保存作者(先保存一的一端) Author a1 = new Author(); a1.setAname("陳恒1"); Author a2 = new Author(); a2.setAname("陳恒2"); ArrayList<Author> allAuthor = new ArrayList<Author>(); allAuthor.add(a1); allAuthor.add(a2); authorRepository.saveAll(allAuthor); //保存文章 Article at1 = new Article(); at1.setTitle("JPA的一對多111"); at1.setContent("其實(shí)一對多映射關(guān)系很常見111。"); //設(shè)置關(guān)系 at1.setAuthor(a1); Article at2 = new Article(); at2.setTitle("JPA的一對多222"); at2.setContent("其實(shí)一對多映射關(guān)系很常見222。"); //設(shè)置關(guān)系 at2.setAuthor(a1);//文章2與文章1作者相同 Article at3 = new Article(); at3.setTitle("JPA的一對多333"); at3.setContent("其實(shí)一對多映射關(guān)系很常見333。"); //設(shè)置關(guān)系 at3.setAuthor(a2); Article at4 = new Article(); at4.setTitle("JPA的一對多444"); at4.setContent("其實(shí)一對多映射關(guān)系很常見444。"); //設(shè)置關(guān)系 at4.setAuthor(a2);//文章3與文章4作者相同 ArrayList<Article> allAt = new ArrayList<Article>(); allAt.add(at1); allAt.add(at2); allAt.add(at3); allAt.add(at4); public Author findByArticleList_titleContaining(String title) { return authorRepository.findByArticleList_titleContaining(title); } @Override public Author findAuthorByArticleListtitleContaining(String title) { return authorRepository.findAuthorByArticleListtitleContaining(title); } }
4、創(chuàng)建控制器類
創(chuàng)建名為com.ch,ch6_4.controller的包 并在該包中創(chuàng)建名為TestSortAndPage的控制器類
package com.ch.ch6_4.controller; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import com.ch.ch6_4.entity.Author; import com.ch.ch6_4.service.ArticleAndAuthorService; @Controller public class TestSortAndPage { @Autowired private ArticleAndAuthorService articleAndAuthorService; @RequestMapping("/findByAnameContaining") @ResponseBody public List<Author> findByAnameContaining(String aname, String sortColum){ return articleAndAuthorService.findByAnameContaining(aname, sortColum); } @RequestMapping("/findAllAuthorByPage") /** * @param page第幾頁 */ public String findAllAuthorByPage(Integer page, Model model){ return articleAndAuthorService.findAllAuthorByPage(page, model); } }
5、創(chuàng)建View視圖頁面
創(chuàng)建index.html頁面 部分代碼如下
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>顯示分頁查詢結(jié)果</title> <link rel="stylesheet" th:href="@{css/bootstrap.min.css}" rel="external nofollow" /> <link rel="stylesheet" th:href="@{css/bootstrap-theme.min.css}" rel="external nofollow" /> </head> <body> <div class="panel panel-primary"> <div class="panel-heading"> <h3 class="panel-title">Spring Data JPA分頁查詢</h3> </div> </tr> <tr> <td colspan="2" align="right"> <ul class="pagination"> <li><a>第<span th:text="${page}"></span>頁</a></li> <li><a>共<span th:text="${totalPage}"></span>頁</a></li> <li><a>共<span th:text="${totalCount}"></span>條</a></li> <li> <a th:href="@{findAllAuthorByPage(page=${page-1})}" rel="external nofollow" th:if="${page != 1}">上一頁</a> </li> <li><a th:href="@{findAllAuthorByPage(page=${page+1})}" rel="external nofollow" th:if="${page != totalPage}">下一頁</a> </li> </ul> </td> </tr> </tbody> </table> </div> </div> </div> </div> </body> </html>
6、運(yùn)行主類 效果如下
到此這篇關(guān)于Spring Data JPA實(shí)現(xiàn)排序與分頁查詢超詳細(xì)流程講解的文章就介紹到這了,更多相關(guān)Spring Data JPA排序與分頁查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java中Integer包裝類裝箱的一個細(xì)節(jié)詳解
Java中的Integer是int的包裝類型,下面這篇文章主要給大家介紹了關(guān)于java中Integer包裝類裝箱的一個細(xì)節(jié)的相關(guān)資料,文中介紹的這個細(xì)節(jié)挺重要的,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起看看吧2018-07-07解決springboot MultipartFile文件上傳遇到的問題
本文給大家?guī)砹私鉀Qspringboot MultipartFile文件上傳遇到的問題,解決方法超簡單,感興趣的朋友參考下本文2018-08-08Java實(shí)現(xiàn)根據(jù)sql動態(tài)查詢并下載數(shù)據(jù)到excel
這篇文章主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)根據(jù)sql動態(tài)查詢并下載數(shù)據(jù)到excel的功能,文中的示例代碼講解詳細(xì),有需要的可以參考下2024-04-04Java web過濾器驗(yàn)證登錄防止未登錄進(jìn)入界面
這篇文章主要介紹了Java web過濾器驗(yàn)證登錄防止未登錄進(jìn)入界面,在一些系統(tǒng)中經(jīng)??梢杂玫酱斯δ?,對java web 驗(yàn)證登錄知識感興趣的朋友一起看下吧2016-08-08詳解Java中的println輸入和toString方法的重寫問題
這篇文章主要介紹了Java中的println輸入和toString方法的重寫,一個對象數(shù)組在調(diào)用Arrays.toString打印時,相當(dāng)于遍歷數(shù)組,然后打印里邊每個對象,這再打印對象就調(diào)用對象自己的toString了,需要的朋友可以參考下2022-04-04Spring security實(shí)現(xiàn)對賬戶進(jìn)行加密
這篇文章主要介紹了Spring security實(shí)現(xiàn)對賬戶進(jìn)行加密,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-03-03