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-08
Java實(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-04
Java 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-04
Spring security實(shí)現(xiàn)對賬戶進(jìn)行加密
這篇文章主要介紹了Spring security實(shí)現(xiàn)對賬戶進(jìn)行加密,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-03-03

