MySQL连接表出现Kotlin暴露错误:“没有匹配的主键/外键对”

时间:2019-07-14 01:36:22

标签: mysql sql kotlin kotlin-exposed

我正在使用Exposed库在Kotlin中处理旧版MySQL数据库。我已经在MySQL上正常工作(简单的查询按预期工作)。我正在运行MySQL版本5.7.26,但我认为问题与MySQL本身无关。

我有两个表,events和event_years。事件中的相关列是id(int,主键)和name(varchar 255)。 Event_years包含一个id(int,主键),year(日期时间)和event_id(int,外键),以及与此问题无关的其他信息。

一个事件在event_years中可能引用了零个或更多行。我想选择事件名称和年份,并按年份排序结果。

我能够使用mysql CLI这样实现:

SELECT e.id, e.name, y.id, y.date 
FROM events e, event_years y
WHERE e.id = y.event_id
ORDER BY y.date;

在Kotlin中,我为Event和EventYears创建了对象:

object Events : Table("events") {
    val id = integer("id").autoIncrement().primaryKey()
    val name = varchar("name", length = 255)
}

object EventYears : Table("event_years") {
    val id = integer("id").autoIncrement().primaryKey()
    val eventId = integer("event_id").uniqueIndex()
    val date = date("date")
}

然后我尝试了以下查询:

val res = EventYears.innerJoin(Events)
    .slice(Events.name, Events.id, EventYears.date, EventYears.id)
    .select { EventYears.eventId eq Events.id }
    .groupBy(EventYears.date)

我希望结果是一个包含这些值的Iterable对象(就像我在不加入查询的情况下收到的那样),但是引发了异常:

java.lang.IllegalStateException: Cannot join with foo.bar.Events@b307e119 as there is no matching primary key/ foreign key pair and constraint missing

在此先感谢您的帮助。我已经阅读了两次Exposed文档,但仍然不明白为什么它不起作用。

2 个答案:

答案 0 :(得分:0)

尝试指定约束条件:

val joinResult = Events.join(EventYears, JoinType.INNER, additionalConstraint = {
EventYears.eventId eq Events.id

然后选择如下

joinResult.select({ EventYears.eventId eq Events.id }) {
   val eventId = it[Events.id]
   val eventYearsId = it[EventYears.eventId]
}

答案 1 :(得分:0)

您应该将eventId定义为val eventId = reference("film", Events).uniqueIndex(),这样您就可以毫无例外地使用查询。

另一种方法是在innerJoin

中显式提供两个列
val res = EventYears.innerJoin(Events, {EventYears.eventId}, {Events.id})
    .slice(Events.name, Events.id, EventYears.date, EventYears.id)
    .selectAll()
    .groupBy(EventYears.date)