OrderBy

查询 Bean 属性具有 asc()desc() 方法,以便将它们添加到 orderBy 子句中。

List<Customer> customers =
  new QCustomer()
    .status.in(Status.NEW, Status.ACTIVE)
    .orderBy()
      .name.desc() // order by t0.name desc
    .findList();

生成以下 SQL

select ...
from customer t0
where t0.status in (?, ?)
order by t0.name desc

我们可以向 orderBy 子句添加多个属性。

List<Customer> customers =
  new QCustomer()
    .status.in(Status.NEW, Status.ACTIVE)
    .orderBy()
      .name.desc()
      .id.asc()
    .findList();

标准 orderBy

对于标准查询,我们使用 orderBy().desc()orderBy().asc(),它们也可以链接在一起。上面的查询不使用查询 Bean 编写如下所示

List<Customer> customers = database.find(Customer.class)
    .where().in("status"), Status.NEW, Status.ACTIVE)
    .orderBy()
      .desc("name")
      .asc("id")
    .findList();

OrderBy 表达式

我们可以指定一个 orderBy 表达式,其中可以通过 orderBy(string) 包含 SQL 公式。

例如简单表达式
new QCustomer()
  .orderBy("name asc,status desc")
  .findList()
例如使用 DB 函数的表达式
List<Customer> customers =
  new QCustomer()
    .status.in(Status.NEW, Status.ACTIVE)
    .orderBy("coalesce(activeDate, now()) desc, name, id")
    .findList();

Nulls high、Nulls low

orderBy 表达式可以包括 nulls highnulls low

List<Customer> customers =
  new QCustomer()
    .orderBy("name nulls high, id desc")
    .findList();

排序规则

我们可以通过 asc()desc() 指定要使用的 排序规则

List<Customer> customers =
  new QCustomer()
    .orderBy()
      .asc("name", "latin_2");
      .desc("id", "latin_1");
    .findList();

ToMany 排序

请注意,当 ORM 查询由于使用 maxRowsfetchQuery(请参阅 获取规则 )而作为多个 SQL 查询执行时,toMany 关系的关联 orderBy 表达式会自动移到相应的 SQL 查询中。

示例
QContact contact = QContact.alias();

List<Customer> customer =
  new QCustomer()
    .contacts.fetch(contact.firstName, contact.lastName, contact.email)
    .orderBy()
      .name.asc()
      .contacts.email.asc()              // (1) automatically moved to secondary sql query
    .setMaxRows(10)                      // (2) maxRows
    .findList();

由于 maxRows,上面的 ORM 查询作为 2 个 SQL 查询执行 - 请参阅 获取规则

-- Primary query
select t0.id, t0.status, t0.name, ...
from customer t0
order by t0.name
limit 10                                -- (2)
-- Secondary query
select t0.customer_id, t0.id, t0.first_name, t0.last_name, t0.email
from contact t0
where (t0.customer_id) in (? )
order by t0.email                       -- (1)