SQL DSL的几种可能风格 in Java/Kotlin

sorra 发表于 08/24 21:22 修改于 08/25 09:48 阅读数82

在思考SQL DSL在强类型的前提下可以如何简化。

Java版:

// 开发者已写User类
// 代码生成器要预先生成UserTable
UserTable u = UserTable.instance();
// select * 可省略select(),直接调from()
select(u.id, u.active).from(u).where()
  .eq(u.active, true)
  .or()
  .le(u.id, 1000)
  .findList();

Kotlin 1版:

// 开发者已写User类
// 代码生成器要预先生成UserTable
fun UserTable.sampleQuery() = select(id, active).from(this).where()
  .eq(active, true)
  .or()
  .le(id, 1000)
  .findList()

Kotlin 2版:

// 开发者已写User类
// 代码生成器要重新生成sampleQuery的真正实现
fun User.sampleQuery() = select(id, active).from(this).where {
    active == true || u.id <= 1000
}.findList()

还可以模仿Django ORM,例如Kotlin的Exposed框架。