跳到主要内容

5.2 动态排序

所谓动态排序,指排序方式由客户端动态指定。

直接使用字符串

客户端指定排序的方式最简单的方法是字符串。

Jimmer支持的字符串格式如下

store.name asc, name asc, edition descstore.name asc; name asc; edition desc

其中store.name表示先通过Book.store属性inner join到关联对象BookStore再按照关联对象的name属性排序。连接路径长度无限,但需要沿途所有属性的关联类型都是一对一或多对一。

String sortCode = ......;

BookTable table = BookTable.$;
List<Book> books = sqlClient
.createQuery(table)
.orderBy(Order.makeOrders(table, sortCode))
.select(table)
.execute();

通过Spring Sort中转

有时,和Spring Data结合开发,可能使用org.springframework.data.domain.Sort表示动态排序。

这时,开发人员需要执行两个步骤

I. 字符串转Sort对象

客户端最容易上传的的还是之前所讨论的形如 store.name asc, name asc, edition descstore.name asc; name asc; edition desc 的字符串。因此,首先需要把字符串转化为org.springframework.data.domain.Sort对象。

导入依赖org.babyfish.jimmer:jimmer-spring-boot-starter:$version后, 然后就可以使用静态方法org.babyfish.jimmer.spring.model.SortUtils.toSort,如下

String sortCode = ......;
Sort sort = SortUtils.toSort(sortCode);

II. 利用Sort对象排序

导入依赖org.babyfish.jimmer:jimmer-spring-boot-starter:$version

  • Java:采用工具方法org.babyfish.jimmer.spring.repository.SpringOrders.toOrdersorg.springframework.data.domain.Sort对象转化为Jimmer接受的排序对象集合。

  • Kotlin:直接使用接受org.springframework.data.domain.Sort对象的orderBy扩展函数即可。

org.springframework.data.domain.Sort sort = ......;

BookTable table = BookTable.$;
List<Book> books = sqlClient
.createQuery(table)
.orderBy(SpringOrders.toOrders(table, sort))
.select(table)
.execute();