Spring Data JPA @Query 中

目录

Pagination Query

JPQL

Native SQL

Spring Data JPA 版本在2.0.4之前

索引参数

JPQL

Native SQL

名称参数

JPQL

Native SQL

集合参数


上一篇中我们介绍了Select QueryOrder Query,本文将继续介绍Pagination Query

Pagination Query

分页查询允许我们返回整个数据集的子集,这很有用,比如在前端页面请求时数据量很大我们就可以使用分页进行查询返回,这样有助于我们提高性能。

JPQL

使用起来很简单,我们只要在方法中定义一个Pageble的参数即可。

@Query(value = "SELECT u FROM User u ORDER BY id")
Page findAllUsersWithPagination(Pageable pageable);

Native SQL

上篇文章我们讲到,如果使用Native SQL去实现排序或者分页功能会出现错误。

org.springframework.data.jpa.repository.query.InvalidJpaQueryMethodException: Cannot use native queries with dynamic sorting and/or pagination

我们有一个折中的方法可以解决此问题

@Query(value = "SELECT * FROM users WHERE age > :age",
       countQuery = "SELECT COUNT(*) FROM users WHERE age > :age",
       nativeQuery = true)
Page findUsersByAgeGreaterThan(@Param("age") int age, Pageable pageable);

Spring Data JPA会自动为我们生成两个查询语句:一个用于获取实际的查询结果,另一个用于获取符合查询条件的记录总数。这是为了支持分页查询等功能。

Spring Data JPA 版本在2.0.4之前

以上做法是针对最新的Spring Data JPA,但是如果你使用的版本比较久远,可以增加如下占位符

\n-- #pageable\n
@Query(
  value = "SELECT * FROM Users ORDER BY id \n-- #pageable\n",
  countQuery = "SELECT count(*) FROM Users",
  nativeQuery = true)
Page findAllUsersWithPagination(Pageable pageable);

索引参数

Spring Data 提供了两种方式传递参数分别是通过索引和通过名称,本小结将讨论通过索引进行参数传递。

JPQL

使用起来也非常简单,根据索引的顺序进行参数的传递。下面的例子findUserByStatusAndNamestatus将会使用第一个参数,而name将使用第二个参数

@Query("SELECT u FROM User u WHERE u.status = ?1")
User findUserByStatus(Integer status);

@Query("SELECT u FROM User u WHERE u.status = ?1 and u.name = ?2")
User findUserByStatusAndName(Integer status, String name);

Native SQL

不能说有什么区别,只能说一摸一样

@Query(
  value = "SELECT * FROM Users u WHERE u.status = ?1", 
  nativeQuery = true)
User findUserByStatusNative(Integer status);

名称参数

除了使用索引参数进行参数传递外,Spring Data还提供了使用名称参数进行参数传递,使用方法是在自定义的Repository方法定义时使用@Param注解。@Param注解接收一个String类型的value用来匹配@Query中定义的变量,这样做的好处是便于阅读理解代码,也会减少一些由于顺序错误导致匹配错误的异常。

JPQL

@Query("SELECT u FROM User u WHERE u.status = :status and u.name = :name")
User findUserByUserStatusAndUserName(@Param("status") Integer userStatus, 
  @Param("name") String userName);

可以看到参数分别为userStatus和userName,而在JPQL和@Param中的参数为status和name

Native SQL

不能说有什么区别,只能说一摸一样

@Query(value = "SELECT * FROM Users u WHERE u.status = :status and u.name = :name", 
  nativeQuery = true)
User findUserByStatusAndNameNamedParamsNative(
  @Param("status") Integer status, @Param("name") String name);

集合参数

在使用SQL中我们常用 innot in关键字来进行查询,同样使用Spring Data JPA也提供的响应的方式传参。

@Query(value = "SELECT u FROM User u WHERE u.name IN :names")
List findUserByNameList(@Param("names") Collection names);

这里的Collection 我们可以使用List,Set等。

你可能感兴趣的:(java,spring,boot)