java分页 倒序取数据_java相关:Spring Data分页与排序的实现方法

java相关:Spring Data分页与排序的实现方法

发布于 2020-5-31|

复制链接

摘记: 前言在实际项目中对Spring Data的各种使用相当多,简单的增删改查Spring Data提供了现成的方法,一些复杂的,我们可以在接口方法写And,Not等关键字来搞定,想写原生SQL,CQL(Neo4j),Query DSL ( ..

前言在实际项目中对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的存储库。

```java

@Repository

public interface PersonRepositary extends PagingAndSortingRepository,QueryDslPredicateExecutor {

@Query("select p from Person p where p.country like ?1 order by country")

List findByCountryContains(String country);

List findPersonByHobbyName(String name);

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

Person findOne(Long id);

}

```

2.  创建域对象。

```java

@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;

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 getHobby() {

return hobby;

}

public void setHobby(List hobby) {

this.hobby = hobby;

}

public void addHobby(Hobby ihobby)

{

if(hobby == null)

{

hobby = new ArrayList();

}

hobby.add(ihobby);

}

@Override

public String toString() {

return "Person [id=" + id + ", name=" + name + ", country=" + country + ", gender=" + gender + "]";

}

}

```

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

```java

@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 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 方法如下:

```java

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 ?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 1. 使用 `java.sql.Statement` 类的 `setMaxRows` 和 `setFetchSize` 方法来设置每页的记录数,然后使用 `java.sql.ResultSet` 类的 `absolute` 方法来跳转到指定页。 2. 使用 `java.sql.PreparedStatement` 类的 `setMaxRows` 和 `setFetchSize` 方法来设置每页的记录数,然后使用 `java.sql.ResultSet` 类的 `absolute` 方法来跳转到指定页。 3. 使用 `SELECT` 语句的 `LIMIT` 和 `OFFSET` 子句来限制查询返回的行数。 4. 使用 `java.sql.Statement` 或 `java.sql.PreparedStatement` 对象的 `executeQuery` 方法执行带有 `LIMIT` 和 `OFFSET` 子句的 `SELECT` 语句,然后使用 `java.sql.ResultSet` 类的 `next` 方法来遍历查询结果。 5. 使用数据库的特定功能(如 MySQL 的 `LIMIT` 子句)来实现分页。这种方法实现方式决于数据库的类型。 ### 回答2: Java实现分页查询的几种常用方法有: 1.使用SQL语句的LIMIT关键字:在查询数据库时,可以使用LIMIT关键字来指定查询结果的起始位置和数量。通过计算页号PageNum和每页数量PageSize,可以得到SQL语句的LIMIT子句,从而实现分页查询。 2.使用MyBatis的分页插件:MyBatis是一种优秀的持久化框架,在其配置文件可以配置分页插件,并使用插件提供的分页功能完成分页查询。通过在Mapper接口定义查询方法,并在配置文件配置插件,可以方便地实现分页逻辑。 3.使用Spring Data JPA的分页查询:Spring Data JPA是一种简化数据库操作的框架,可以通过定义Repository接口来实现数据的增删改查操作。在查询方法,可以使用Pageable参数来指定查询结果的起始位置和数量,从而实现分页查询。 4.使用PageHelper插件:PageHelper是一种基于MyBatis的分页插件,提供了丰富的分页查询功能。在查询方法,可以通过调用PageHelper.startPage方法来指定页号和每页数量,PageHelper会自动在SQL语句添加LIMIT子句,从而实现分页查询。 5.使用自定义工具类:可以自定义一个工具类来实现分页查询逻辑。通过传入查询结果集合、页号和每页数量,可以在工具类进行计算,得到分页查询的结果集合。 以上是Java实现分页查询的几种常用方法,根据项目的需求和使用的框架,可以选择适合的方法实现分页功能。 ### 回答3: Java实现分页查询有多种方法,以下是几种常见的实现方式: 1. 使用数据库的分页查询:在SQL语句使用LIMIT关键字,通过设置偏移量和每页显示的数据条数,实现分页效果。例如,使用MySQL数据库时,可以通过"SELECT * FROM table_name LIMIT offset, limit"语句来实现分页查询。 2. 使用集合分页:将查询结果全部加载到内存的集合,然后通过对集合进行切片操作,截指定页的数据实现分页效果。常见的集合类如List、ArrayList等都提供了subList方法,可以方便地实现分页。 3. 使用ORM框架:ORM(Object-Relational Mapping)框架如Hibernate、MyBatis等,提供了丰富的分页查询功能。通常只需在查询方法传入页码和每页显示的数据数量,框架会自动生成对应的分页查询SQL语句,并返回分页查询结果。 4. 使用第三方库:有一些开源的分页查询库可以直接使用,如PageHelper、Spring Data JPA等。这些库提供了简单易用的API,可以快速实现分页查询功能。 需要注意的是,无论使用哪种方法实现分页查询,都要考虑性能和数据量。当处理大数据量时,应尽量减少数据库查询次数,避免一次性加载全部数据;同时,合理使用缓存、索引等技术,提高查询效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值