Spring Data分页与排序的实现方法

 更新时间:2018年12月04日 11:10:23   作者:banq  
这篇文章主要给大家介绍了关于Spring Data分页与排序的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

在实际项目中对Spring Data的各种使用相当多,简单的增删改查Spring Data提供了现成的方法,一些复杂的,我们可以在接口方法写And,Not等关键字来搞定,想写原生SQL,CQL(Neo4j),Query DSL (Elasticsearch)的,直接使用@Query(“......”)注解搞定,真的是方便到不行!

当我们执行批量操作时,比如从数据库中查找“Person”的所有实例或者根据国家查找每个人,我们经常进行分页,以便我们可以向最终用户提供一个小数据块,并在下一个请求中,我们获取下一个数据块。

Spring Data为分页提供支持。它创建了实现分页的所有逻辑,例如所有页面的行计数等等。

在Spring Data中实现分页非常简单。我们只需要按照以下步骤操作:

  • 在自定义存储库中,扩展  PagingAndSortingRepository。
  • 创建PageRequest对象,该对象是Pageable接口的实现。  此PageRequest对象获取页码,页面大小以及排序方向和排序字段。
  • 通过传递请求的页码和页面限制,您可以获取此页面的数据。如果您传递错误的页码,Spring Data将负责处理并且不返回任何数据。

1.创建扩展PagingAndSortingRepository的存储库。

@Repository
public interface PersonRepositary extends PagingAndSortingRepository<Person, Long>,QueryDslPredicateExecutor<Person> {

 @Query("select p from Person p where p.country like ?1 order by country")
 List<Person> findByCountryContains(String country);

 List<Person> findPersonByHobbyName(String name);

 @Query("select p from Person p where p.id = ?1 and country='America'")
 Person findOne(Long id);
}

2.  创建域对象。

@Entity
public class Person {
 @Id
 @GeneratedValue(strategy=GenerationType.AUTO)
 private Long id;
 private String name;
 private String country;
 private String gender;
@OneToMany(mappedBy="person",targetEntity=Hobby.class,
  fetch=FetchType.EAGER,cascade=CascadeType.ALL)
  List<Hobby> hobby;
public String getName() {
 return name;
}
public void setName(String name) {
 this.name = name;
}
public String getCountry() {
 return country;
}
public void setCountry(String country) {
 this.country = country;
}
public String getGender() {
 return gender;
}
public void setGender(String gender) {
 this.gender = gender;
}
public Long getId() {
 return id;
}
public void setId(Long id) {
 this.id = id;
}
public List<Hobby> getHobby() {
 return hobby;
}
public void setHobby(List<Hobby> hobby) {
 this.hobby = hobby;
}
public void addHobby(Hobby ihobby)
{
 if(hobby == null)
 {
  hobby = new ArrayList<Hobby>();
 }
 hobby.add(ihobby);
}
 @Override
 public String toString() {
  return "Person [id=" + id + ", name=" + name + ", country=" + country + ", gender=" + gender + "]";
 }
}

3.获取所有人员。创建一个限制为1的PageRequest对象并请求第一页。

@SpringBootApplication
@EnableJpaRepositories("com.example.repo")
public class PersonApplication {
 @Autowired
 HobbyRepository hRepo;

 private static final Logger log = LoggerFactory.getLogger(PersonApplication.class);

 @Bean
 public CommandLineRunner demo(PersonRepositary repository) {
  findAll(repository);
  return null;
 }

 private PageRequest gotoPage(int page)
 {
  PageRequest request = new PageRequest(page,1)
  return request;
 }

 private void findAll(PersonRepositary repository)
 {
  Iterable<Person> pList = repository.findAll(gotoPage(0));
  for(Person p : pList)
   log.info("Person " + p);
 }

 public static void main(String[] args) {
  SpringApplication.run(PersonApplication.class, args);
 }
}

运行时SQL输出:

Hibernate:
    select
        count(person0_.id) as col_0_0_
    from
        person person0_
Hibernate:
    select
        person0_.id as id1_1_,
        person0_.country as country2_1_,
        person0_.gender as gender3_1_,
        person0_.name as name4_1_
    from
        person person0_ limit ?
Person Person [id=13, name=Samir mitra, country=America, gender=male]

分页和排序代码实现

要进行排序,我们必须传递排序方向和排序字段以及页码和限制。假设我们想按国家名称按升序排序 - 我们修改  goto 方法如下:

private PageRequest gotoPage(int page)
{
 PageRequest request = new PageRequest(page,1,Sort.Direction.ASC,"country");
 return request;
}

SQL输出:

select
        count(person0_.id) as col_0_0_
    from
        person person0_
Hibernate:
    select
        person0_.id as id1_1_,
        person0_.country as country2_1_,
        person0_.gender as gender3_1_,
        person0_.name as name4_1_
    from
        person person0_
    order by
        person0_.country asc limit ?

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • 解决jpa查询语句自动变成了update的问题

    解决jpa查询语句自动变成了update的问题

    这篇文章主要介绍了解决jpa查询语句自动变成了update的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • SpringCloud Gateway实现API接口加解密

    SpringCloud Gateway实现API接口加解密

    这篇文章主要为大家介绍了SpringCloud Gateway如何实现API接口加解密的,文中的示例代码讲解详细,对我们学习有一定的帮助,需要的可以参考一下
    2022-06-06
  • Spring Boot 2.x 实现文件上传功能

    Spring Boot 2.x 实现文件上传功能

    这篇文章主要介绍了Spring Boot 2.x 实现文件上传功能,本文分步骤通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Java Durid进行JDBC连接详解

    Java Durid进行JDBC连接详解

    今天给大家带来的是关于Java的相关知识,文章简单使用Durid进行JDBC连接,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-09-09
  • Java8处理集合的优雅姿势之Stream

    Java8处理集合的优雅姿势之Stream

    这篇文章主要给大家介绍了关于Java8优雅处理集合之Stream的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用java8具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03
  • springboot+springmvc实现登录拦截

    springboot+springmvc实现登录拦截

    这篇文章主要介绍了springboot+springmvc实现登录拦截,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • springboot中将日志信息存储在catalina.base中过程解析

    springboot中将日志信息存储在catalina.base中过程解析

    这篇文章主要介绍了springboot中将日志信息存储在catalina.base中过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Java匿名类,匿名内部类实例分析

    Java匿名类,匿名内部类实例分析

    这篇文章主要介绍了Java匿名类,匿名内部类,结合实例形式分析了Java匿名类,匿名内部类相关原理、用法及操作注意事项,需要的朋友可以参考下
    2020-04-04
  • Java中BigDecimal序列化科学计数法前端展示问题踩坑实战

    Java中BigDecimal序列化科学计数法前端展示问题踩坑实战

    BigDecimal是处理高精度的浮点数运算的常用的一个类当需要将BigDecimal中保存的浮点数值打印出来,这篇文章主要给大家介绍了关于Java中BigDecimal序列化科学计数法前端展示问题踩坑的相关资料,需要的朋友可以参考下
    2024-04-04
  • java通过Arrays.sort(int[] a)实现由大到小排序的方法实现

    java通过Arrays.sort(int[] a)实现由大到小排序的方法实现

    Java中的Arrays.sort()方法是一种内置的排序方法,用于对数组进行排序,本文就来介绍一下java中的Arrays.sort()排序方法的用法,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12

最新评论