查询、分页、排序
查询、分页、排序
查询
查询有
方法名字方式查询
@Query注解方式查询
动态SQL方式查询
Example方式查询
JpaJpaRepository提供了如下表所述的内置查询。
List<T> findAll();
- 返回所有实体List<T> findAllById(Iterable<ID> var1);
- 返回指定id的所有实体T getOne(ID var1);
- 根据id返回对应的实体,如果未找到,则返回空。List<T> findAll(Sort var1);
- 返回所有实体,按照指定顺序返回。Page<T> findAll(Pageable var1);
- 返回实体列表,实体的offset 和limit通过pageable来指定
方法名字方式查询方式
Spring Data 通过查询的方法名和参数名来自动构造一个JPA QQL查询
比如
方法名和参数名要遵守一定的规则, Spring Data JPA 才能自动转换为JPQL:
方法名通常包含多个实体属性用于查询,属性之间可以使用AND和OR连接,也支持Between、LessThan、GreaterThan、Like;
方法名可以以findBy、getBy、queryBy 开头;
查询结果可以排序,方法名包含OrderBy+属性+ASC(DESC);
可以通过Top、First来限定查询的结果集;
一些特殊的参数可以出现在参数列表里,比如Pageeable、Sort
例子:
注意:Spring Data的Query 适用于关系数据库操作,也适合NOSQL。大部分Spring Boot应用中,Query构造只能创建一些简单的查询。但对于NOSQL来说已经足够了,不需要自己再构造NOSQL查询
@Query注解方式查询
注解Query允许在方法上使用JPQL
其中操作针对的是对象名和对象属性名,而非数据库中的表名和字段名
如果使用SQL而不是JPSQL,可以使用nativeQuery
属性,设置为true
无论JPQL,还是SQL,都支持"命名参数":
如果SQL活着JPQL查询结果集并非Entity,可以用Object[]数组代替,比如分组统计每个部分的用户数:
这条查询将返回数组,对象类型依赖于查询结果,被示例中,返回的是String和BigInteger类型
查询时可以使用Pageable和Sort来完成翻页和排序。
@Query 还允许SQL更新、删除语句,此时必须搭配@Modifying使用,比如:
动态SQL方式查询
spring data jpa 利用JpaSpecificationExecutor做复杂查询
Spring data JPA中使用Specifications动态构建查询
Example方式查询
允许根据实体创建一个Example对象,Spring Data通过Example对象来构造JPQL。但是使用不灵活条件是AND,不能使用or,时间的大于小于,between等。
继承
JpaRepository
以上代码首先创建了User对象,设置 查询条件,名称为参数name,部门id为1,通过Example.of
构造了此查询。
大部分查询并非完全匹配查询,ExampleMatcher 提供了更多的条件指定.比如以xxx开头的所有用户,则可以使用以下代码构造:
排序Sort
Sort对象用来指定排序,最简单的Sort对象构造可以传入一个属性名列表(不是数据库列名,是属性名)。默认采用升序排序。
Hibernate 根据Sort构造了排序条件,Sort("id")
表示按照id采用默认 升序进行排序
其他Sort的构造方法还包括以下主要的一些:
public Sort(String... properties)
, 按照指定的属性列表升序排序。public Sort(Sort.Direction direction, String... properties)
, 按照指定属性列表排序,排序由direction
指定,direction
是一个枚举类型,有Direction.ASC
和Direction.DESC
public Sort(Sort.Order... orders)
, 可以通过Order静态方法来创建public static Sort.Order asc(String property)
public static Sort.Order desc(String property)
分页Page和Pageable
Page和Pageable
Pageable 接口用于构造翻页查询,PageRequest是其实现类,可以通过提供的工厂方法创建PageRequest:
注意我这边使用的是sring boot 2.0.2 ,jpa版本是2.0.8,新版本与之前版本的操作方法有所不同。
public static PageRequest of(int page, int size)
public static PageRequest of(int page, int size, Sort sort) - 也可以在PageRequest中加入排序
public static PageRequest of(int page, int size, Direction direction, String... properties)
,或者自定义排序规则
page是从0开始,表示查询页,size指每页的期望行数。
Spring Data翻页查询总是返回Page对象,Page对象提供了以下常用的方法
int getTotalPages();
, 总的页数long getTotalElements();
- 返回总数List<T> getContent();
- 返回此次查询的结果集
示例:
Last updated