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 high
或 nulls 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 查询由于使用 maxRows 或 fetchQuery(请参阅 获取规则 )而作为多个 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)