使用Spring Data Jpa查询全部并排序
作者:yogima
Spring Data Jpa查询全部并排序
1、Repository层只需要简单地extends JpaRepository
依旧不用写任何东西。因为它自己其实有一个findAll(Sort sort)的方法,直接用就可以了。
2、Service层中如下
List<xxxDO> xxxDOS = xxxRepository.findAll(new Sort(Sort.Direction.ASC,"属性名"));
但注意springboot2.2.1及以上的版本Sort的构造方法变为私有,需要像下面这样写:
List<xxxDO> xxxDOS = xxxRepository.findAll(Sort.by(Sort.Direction.ASC,"属性名"));
JPA之排序问题
1、总览
本文将要探讨的是用于Java Persistence API(JPA)排序的各种实现方式,它们适用于简单实体以及一对多关系中的实体。这些方法将排序工作的负担委托给数据库层。
2、使用JPA / JQL API排序
通过使用Order By关键词实现JQL排序:
String jql ="Select * from Student order by id"; Query query = entityManager.createQuery (jql);
基于上面的查询,JPA生成如下简单的SQL语句:
Hibernate: select * from Student order by id
注:JQL字符串中的SQL关键字不区分大小写,但是实体的名称及其属性是区分的(实体:Student、属性:id)。
2.1、设置排序顺序
默认情况下,排序顺序是升序的,但是可以在JQL字符串中显式设置。就像在纯SQL中一样,排序选项是asc和desc:
String jql = "Select * from Student order by id desc"; Query sortQuery = entityManager.createQuery(jql);
其生成的SQL查询将会包括排序的升降方向:
Hibernate: select * from Student order by id desc
2.2、按两个及以上的属性个数排序
为了按多个属性排序,会将需要排序的属性都添加到JQL字符串的order by子句中:
String jql="Select * from Student Order by name asc,id desc"; Query sortQuery = entityManager.createQuery(jql);
同样的排序条件将会出现在生成的SQL查询语句中:
Hibernate: select * from Student order by name asc,id desc
注:对于多属性排序,优先排第一个属性,当第一个值相同时在按照第二个属性进行排序,以此类推。
2.3、设置空值的排序优先级
默认的空值优先级是在数据库中特定了的,但这可以通过HQL查询字符串中的NULLS FIRST或NULLS LAST子句进行自定义。
举一个简单的示例–按Student的name属性降序排列,并将Nulls放在末尾:
Query sortQuery = entityManager.createQuery ("Select * from Student order by name desc NULLS LAST");
那么,其生成的SQL查询将是如下情况:
Hibernate: select * from Student order by case when name is null then 1 else 0 end, desc
2.4、一对多关系排序
超越基本示例,现在看一个用例,该用例涉及以一对多关系对实体进行排序– Bar包含Student实体的集合。我们要对Bar实体及其Student实体的集合进行排序-JPA对于此任务特别简单:
1、对集合进行排序:在Bar实体的Student集合上添加一个@OrderBy注解:
@OrderBy("name ASC") List <Student> studentList;
2、对包含集合的实体进行排序:
String jql = "Select * from Bar as b order by b.id"; Query barQuery = entityManager.createQuery(jql); List<Bar> barList = barQuery.getResultList();
注:此处使用了@OrderBy注解的原因是:我们要对每个Bar的Student集合进行排序。
接下来看一下以上JQL对应的SQL语句吧:
Hibernate: select * from Bar b order by b.id Hibernate: select * from Student slist where slist.bar_id=? order by slist.name asc
第一个查询对父Bar实体进行排序。生成第二个查询以对属于Bar的子Student实体的集合进行排序。
3、使用JPA条件查询对象API进行排序
使用JPA Criteria – orderBy方法是设置所有排序参数的“一站式”选择:可以设置排序方向和排序依据。以下是该方法的API:
orderBy(CriteriaBuilder.asc):升序排序。 orderBy (CriteriaBuilder.desc): 降序排序。
每个Order实例都是通过CriteriaBuilder对象的asc或desc方法创建的.
这是一个简单的示例-按名称对Student进行排序:
CriteriaQuery<Student> criteriaQuery = criteriaBuilder.createQuery(Student.class); Root<Student> from = criteriaQuery.from(Student.class); CriteriaQuery<Student> select = criteriaQuery.select(from); criteriaQuery.orderBy(criteriaBuilder.asc(from.get("name")));
get方法的参数区分大小写,因为它需要与属性名称匹配。
与简单的JQL相反,JPA条件查询对象API会在查询中强制使用明确的顺序方向。注意,在此代码片段的最后一行中,criteriaBuilder对象通过调用其asc方法指定了升序排列。
执行上述代码后,JPA会生成如下所示的SQL查询。 JPA Criteria Object生成带有显式asc子句的SQL语句:
Hibernate: select * from Student order by asc
3.1、按两个及以上的属性个数排序
要对多个属性进行排序,只需将Order实例传递给orderBy方法,以对每个属性进行排序。 这是一个简单的示例-按名称和ID分别按升序和降序排序:
CriteriaQuery<Student> criteriaQuery = criteriaBuilder.createQuery(Student.class); Root<Student> from = criteriaQuery.from(Student.class); CriteriaQuery<Student> select = criteriaQuery.select(from); criteriaQuery.orderBy(criteriaBuilder.asc(from.get("name")), criteriaBuilder.desc(from.get("id")));
相应的SQL查询如下所示:
Hibernate: select * from Student order by name asc,id desc
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。