@OrderBy 注解用来指定在查询一对多、多对多关联关系中,关联集合元素的顺序。
@OrderBy 注解通过一个 orderby_list 语法进行实现,语法如下:
orderby_list = orderby_item [,orderby_item]*
一个 orderby_list 字符串可以使用逗号分割,指定多个 orderby_item。orderbyte_item 语法如下:
orderby_item = [property_or_field_name] [ASC | DESC]
一个 orderby_item 由两部分组成(它们使用空格分开),前面指定用来排序的字段或者对象属性,后面指定排序顺序(ASC:递增排序;DESC 递减排序)。
如果 orderbyte_item 未指定 ASC 或 DESC,则默认为 ASC(升序)。
如果没有为实体关联指定排序元素,则假定按关联实体的主键排序(@Id 修饰的字段或属性)。
注意:
(1)orderby_item 中的属性或字段名称必须与关联类或其中嵌入类的持久属性或字段的名称相对应;
(2)用于排序的属性或字段必须支持比较运算符,否则不能排序;
(3)如果关联对象采用了嵌入对象,则可以使用点(“.”)表示法来指代嵌入对象中的属性,与点符号一起使用的每个标识符的值是相应嵌入字段或属性的名称。
@OrderBy 注解可以应用于元素集合,如:List。当 @OrderBy 应用于基本类型的元素集合时,将按基本对象的值进行排序,并且不使用属性或字段名称。在对可嵌入类型的元素集合指定排序时,必须使用点(.)符号来指定确定排序的一个或多个属性。
下面将根据一个一对多(教师和学生,一个教师拥有多个学生)的例子来介绍怎样使用 @OrderBy 注解的用法。
首先,先看看学生 Student 和 教师 Teacher 没有添加 @OrderBy 注解的实体 Java 代码,代码如下:
Student.java
import lombok.Data;
import javax.persistence.*;
@Data
@Entity
@Table
public class Student {
@Id
@GeneratedValue
private int id;
@Column
private String name;
@Column
private String sex;
@Column
private float salary;
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
", salary=" + salary +
'}';
}
}Teacher.java
import lombok.Data;
import javax.persistence.*;
import java.util.List;
@Data
@Entity
@Table
public class Teacher {
@Id
@GeneratedValue
private int id;
@Column
private String name;
@OneToMany(cascade = CascadeType.ALL)
private List<Student> studentList;
}下面将介绍怎样在 Teacher 实体中,怎样为 studentList 属性添加 @OrderBy 注解,进行排序。如下:
// JPA 默认根据 Student 的 ID 主键对 studentList 集合数据进行递增排序
@OneToMany(cascade = CascadeType.ALL)
@OrderBy
private List<Student> studentList;
// 手动指定 id 字段的排序方式,ASC 递增排序,DESC 递减排序
@OneToMany(cascade = CascadeType.ALL)
@OrderBy("id desc")
private List<Student> studentList;
// 手动指定按照 salary 属性进行递减排序
@OneToMany(cascade = CascadeType.ALL)
@OrderBy("salary desc")
private List<Student> studentList;
// 手动指定按照多个属性进行排序
// 下面将根据 sex 和 salay 进行递增排序
@OneToMany(cascade = CascadeType.ALL)
@OrderBy("sex,salary")
private List<Student> studentList;
// 下面将根据 sex 递增排序,salary 递增排序
@OneToMany(cascade = CascadeType.ALL)
@OrderBy("sex asc,salary asc")
private List<Student> studentList;
// 下面将根据 sex 递增排序,salary 递减排序
@OneToMany(cascade = CascadeType.ALL)
@OrderBy("sex asc,salary desc")
private List<Student> studentList;