You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Kotlin Exposed的orderBy中实现枚举自定义排序?

自定义Exposed查询中枚举字段的排序顺序

问题背景

数据库中以字符串形式存储枚举类:

enum class Status {
    PENDING, ACCEPTED, REJECTED
}

使用Exposed定义对应表:

object Examples : Table("examples") {
    val id = integer("id")
    val status = enumerationByName("status", 100, Status::class)
    override val primaryKey = PrimaryKey(id)
}

默认通过Examples.selectAll().orderBy(Examples.status to SortOrder.ASC)排序时,结果按字母顺序排列(ACCEPTED排在最前),但需要实现自定义顺序:PENDING → ACCEPTED → REJECTED。尝试的Case表达式代码编译失败,需解决该问题。

解决方案

编译失败的核心原因是误用了Exposed的API:Case类中添加条件的方法是小写的when_(为避开Kotlin关键字),而非大写When。以下是两种正确实现方式:

方式一:指定字段的Case表达式

Examples.selectAll()
    .orderBy(
        Case(Examples.status)
            .when_(Status.PENDING, 1)
            .when_(Status.ACCEPTED, 2)
            .when_(Status.REJECTED, 3)
            .else_(3) to SortOrder.ASC
    )

方式二:显式条件的Case表达式

Examples.selectAll()
    .orderBy(
        Case()
            .when_(Examples.status eq Status.PENDING, 1)
            .when_(Examples.status eq Status.ACCEPTED, 2)
            .when_(Examples.status eq Status.REJECTED, 3)
            .else_(3) to SortOrder.ASC
    )

说明

  • 两种写法均通过给不同枚举值分配优先级数字(1 < 2 < 3),让MySQL按数字升序排列,从而实现自定义的枚举顺序。
  • 若后续需要调整排序规则,只需修改数字对应的枚举值即可,无需改动数据库结构。

内容的提问来源于stack exchange,提问作者Marco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 15:15:16