【发布时间】:2018-11-15 07:44:03
【问题描述】:
我正在尝试使用 jOOQ 和 Kotlin,并查看了一些教程和文档,它们看起来非常不错。
但是,如果 jOOQ 有一些非常烦人的地方,那就是代码生成。它看起来太复杂了,最终无法维护。我决定创建自己的表模型(类似于 hibernate 的工作方式)。
我创建了两个表模型:
用户
data class User(
val id: String = UUID.randomUUID().toString(),
val name: String,
val email: String,
val password: String? = null
) {
companion object {
val TABLE: Table<Record> = DSL.table("user")
val ID: Field<String> = DSL.field("id", String::class.java)
val USER_NAME: Field<String> = DSL.field("user_name", String::class.java)
val EMAIL: Field<String> = DSL.field("email", String::class.java)
val PASSWORD: Field<String> = DSL.field("password", String::class.java)
}
}
关注者
data class Followers(
val id: String,
val followerId: String,
val userId: String
) {
companion object {
val TABLE: Table<Record> = DSL.table("followers")
val ID: Field<String> = DSL.field("id", String::class.java)
val FOLLOWER_ID: Field<String> = DSL.field("follower_id", String::class.java)
val USER_ID: Field<String> = DSL.field("user_id", String::class.java)
}
}
当我做了一些琐碎的 SQL 语句并且它运行良好,但是当我尝试下一条语句时,我得到了异常。
return dsl.select().from(u.TABLE)
.rightJoin(f.TABLE).on(u.ID.eq(f.FOLLOWER_ID))
.where(u.ID.eq(id)).fetch().into(User::class.java)
这段代码的预期语句是:
select *
from user u
right outer join followers f
on u.id = f.follower_id
where u.id = 'e30919bf-5f76-11e8-8c96-701ce7e27f83';
但我从这段代码中得到的陈述是:
select *
from user
right outer join followers
on id = follower_id
where id = 'e30919bf-5f76-11e8-8c96-701ce7e27f83'
当然,这给了我(正确地)错误where子句中的列'id'不明确
它提出了几个问题:
- 有没有更好的方法来声明表模型而不生成代码。
- 为什么 DSL
select没有转换为正确的 SQL 语句?我做错了什么?
【问题讨论】: