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
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JPA 中,你可以使用 `Sort` 对象来进行排序。`Sort` 对象可以通过指定一个或多个排序条件来创建,并在查询方法中使用。下面是一个示例: ```java @Repository public interface UserRepository extends JpaRepository<User, Long> { List<User> findAll(Sort sort); // 使用 Sort 对象进行排序 // 示例查询方法,返回按照年龄升序排列的用户列表 List<User> findAllByAgeGreaterThan(int age, Sort sort); } ``` 在上面的例子中,我们定义了一个名为 `findAll` 的查询方法,它接受一个 `Sort` 对象作为参数,用于指定排序方式。另外,我们还定义了一个示例查询方法 `findAllByAgeGreaterThan`,它接受一个年龄参数和一个 `Sort` 对象,并返回按照年龄升序排列的用户列表。 在调用这些查询方法时,你可以传递一个 `Sort` 对象来指定排序方式。下面是使用示例: ```java @Service public class UserService { @Autowired private UserRepository userRepository; public List<User> getAllUsersOrderedByName() { Sort sort = Sort.by(Sort.Direction.ASC, "name"); // 按照用户名升序排列 return userRepository.findAll(sort); } public List<User> getUsersByAgeOrderedByAge(int age) { Sort sort = Sort.by(Sort.Direction.ASC, "age"); // 按照年龄升序排列 return userRepository.findAllByAgeGreaterThan(age, sort); } } ``` 在上面的示例中,我们使用 `Sort.by()` 方法创建了一个 `Sort` 对象,并指定了排序方向(升序或降序)以及排序字段。然后将 `Sort` 对象传递给相应的查询方法。这样,查询结果将按照指定的排序方式返回。 通过使用 `Sort` 对象,你可以在 JPA 中方便地实现排序功能。你可以根据需要指定多个排序条件,或者根据不同的查询方法使用不同的排序方式。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值