加入 eq 功能不适用于 Jooq 和 Kotlin
Join eq function not working with Jooq and Kotlin
我正在使用:
- Jooq 3.13.2
- 科特林 1.3.71
- Spring 引导 2.2.6.RELESE
- Java 11
我能够生成 Jooq 类 并执行一个简单的查询:
class StoryCustomRepositoryImpl @Autowired constructor(
private val dslContext: DSLContext
): StoryCustomRepository {
override fun findEmployeeStories(pageable: Pageable) {
return dslContext.select(STORY.ID, STORY.DESCRIPTION)
.from(STORY)
.forEach { println($it[STORY.ID]) }
}
}
当我尝试通过添加连接来添加更复杂的逻辑时,编译失败:
class StoryCustomRepositoryImpl @Autowired constructor(
private val dslContext: DSLContext
): StoryCustomRepository {
override fun findEmployeeStories(pageable: Pageable) {
return dslContext.select(STORY.ID, STORY.DESCRIPTION)
.from(STORY)
.join(USERS).on(USERS.ID.eq(STORY.CREATED_BY))
.forEach { println($it[STORY.ID]) }
}
}
下一行编译失败 .join(USERS).on(USERS.ID.eq(STORY.CREATED_BY))
错误:
None of the following functions can be called with the arguments supplied:
public abstract fun eq(p0: Int!): Condition! defined in org.jooq.TableField
public abstract fun eq(p0: Field<Int!>!): Condition! defined in org.jooq.TableField
public abstract fun eq(p0: QuantifiedSelect<out Record1<Int!>!>!): Condition! defined in org.jooq.TableField
public abstract fun eq(p0: Select<out Record1<Int!>!>!): Condition! defined in org.jooq.TableField
我正在学习本教程:https://blog.jooq.org/2017/05/18/10-nice-examples-of-writing-sql-in-kotlin-with-jooq/
编辑:
看起来问题在于 STORY.CREATED_BY 是 Long 类型,而 USERS.ID 是 Integer 类型。我不确定需要更改什么才能解决此问题。
谢谢
您可能应该将所有这些 ID
列的类型及其引用更改为相同,即 BIGINT
.
作为快速解决方法,您可以使用 Field.coerce()
. I would prefer that over Field.cast()
。不同之处在于 coerce()
对生成的 SQL 没有任何影响(您希望避免这种情况以获得更好的索引使用),而 cast()
转换为 SQL CAST()
函数。
我正在使用:
- Jooq 3.13.2
- 科特林 1.3.71
- Spring 引导 2.2.6.RELESE
- Java 11
我能够生成 Jooq 类 并执行一个简单的查询:
class StoryCustomRepositoryImpl @Autowired constructor(
private val dslContext: DSLContext
): StoryCustomRepository {
override fun findEmployeeStories(pageable: Pageable) {
return dslContext.select(STORY.ID, STORY.DESCRIPTION)
.from(STORY)
.forEach { println($it[STORY.ID]) }
}
}
当我尝试通过添加连接来添加更复杂的逻辑时,编译失败:
class StoryCustomRepositoryImpl @Autowired constructor(
private val dslContext: DSLContext
): StoryCustomRepository {
override fun findEmployeeStories(pageable: Pageable) {
return dslContext.select(STORY.ID, STORY.DESCRIPTION)
.from(STORY)
.join(USERS).on(USERS.ID.eq(STORY.CREATED_BY))
.forEach { println($it[STORY.ID]) }
}
}
下一行编译失败 .join(USERS).on(USERS.ID.eq(STORY.CREATED_BY))
错误:
None of the following functions can be called with the arguments supplied:
public abstract fun eq(p0: Int!): Condition! defined in org.jooq.TableField
public abstract fun eq(p0: Field<Int!>!): Condition! defined in org.jooq.TableField
public abstract fun eq(p0: QuantifiedSelect<out Record1<Int!>!>!): Condition! defined in org.jooq.TableField
public abstract fun eq(p0: Select<out Record1<Int!>!>!): Condition! defined in org.jooq.TableField
我正在学习本教程:https://blog.jooq.org/2017/05/18/10-nice-examples-of-writing-sql-in-kotlin-with-jooq/
编辑: 看起来问题在于 STORY.CREATED_BY 是 Long 类型,而 USERS.ID 是 Integer 类型。我不确定需要更改什么才能解决此问题。
谢谢
您可能应该将所有这些 ID
列的类型及其引用更改为相同,即 BIGINT
.
作为快速解决方法,您可以使用 Field.coerce()
. I would prefer that over Field.cast()
。不同之处在于 coerce()
对生成的 SQL 没有任何影响(您希望避免这种情况以获得更好的索引使用),而 cast()
转换为 SQL CAST()
函数。