выставленный котлином сбой (вставка выполнена успешно, но выбор-ошибка)

#kotlin #h2 #kotlin-exposed

Вопрос:

спасибо, что прочитали этот вопрос.

Я создал простой проект kotlin и хочу изучить kotlin exposed.

Я использую базу данных H2.

Я написал код, как показано ниже.

 package learn.exposed.tables

import org.jetbrains.exposed.sql.Table

object AuthorTable : Table("author") {

    val name = varchar("name", 30)
}
 
 fun main() {
    // this url based on http://www.h2database.com/html/features.html#execute_sql_on_connection
    val url = "jdbc:h2:mem:test;INIT=runscript from 'classpath:/create.sql'\;runscript from 'classpath:/init.sql'"
    Database.connect(url, driver = "org.h2.Driver", user = "root", password = "")

    transaction {
        AuthorTable.insert {
            it[name] = "hoge"
        }
        println("insert done.") // this message can show on console. I think Insert is successfull.
    }

    transaction {
        AuthorTable.selectAll().firstOrNull()
    }
}
 

и файлы sql ниже.

 create table author (name varchar(30));

 
 insert into author values ('author1');
 

При выполнении main() отображается консоль insert done. . короче говоря, я думаю, что вставка работает хорошо , но при выполнении AuthorTable.selectAll().firstOrNull() происходит исключение, как показано ниже,

 Exception in thread "main" org.jetbrains.exposed.exceptions.ExposedSQLException: org.h2.jdbc.JdbcSQLNonTransientException: 一般エラー: "java.lang.NullPointerException"
General error: "java.lang.NullPointerException" [50000-200]
SQL: [Failed on expanding args for SELECT: org.jetbrains.exposed.sql.Query@27406a17]
    at org.jetbrains.exposed.sql.statements.Statement.executeIn$exposed_core(Statement.kt:62)
    at org.jetbrains.exposed.sql.Transaction.exec(Transaction.kt:135)
    at org.jetbrains.exposed.sql.Transaction.exec(Transaction.kt:121)
    at org.jetbrains.exposed.sql.AbstractQuery.iterator(AbstractQuery.kt:65)
    at kotlin.collections.CollectionsKt___CollectionsKt.firstOrNull(_Collections.kt:267)
    at learn.exposed.MainKt$main$2.invoke(Main.kt:22)
    at learn.exposed.MainKt$main$2.invoke(Main.kt)
    at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.inTopLevelTransaction$run(ThreadLocalTransactionManager.kt:179)
    at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.access$inTopLevelTransaction$run(ThreadLocalTransactionManager.kt:1)
    at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt$inTopLevelTransaction$1.invoke(ThreadLocalTransactionManager.kt:205)
    at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.keepAndRestoreTransactionRefAfterRun(ThreadLocalTransactionManager.kt:213)
    at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.inTopLevelTransaction(ThreadLocalTransactionManager.kt:204)
    at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt$transaction$1.invoke(ThreadLocalTransactionManager.kt:156)
    at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.keepAndRestoreTransactionRefAfterRun(ThreadLocalTransactionManager.kt:213)
    at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.transaction(ThreadLocalTransactionManager.kt:126)
    at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.transaction(ThreadLocalTransactionManager.kt:123)
    at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.transaction$default(ThreadLocalTransactionManager.kt:122)
    at learn.exposed.MainKt.main(Main.kt:21)
    at learn.exposed.MainKt.main(Main.kt)
 

могу ли я решить эту проблему? вы знаете что-нибудь, как это решить?

Спасибо.

Ответ №1:

Похоже, вам нужен по крайней мере один первичный ключ(PK) или ограничение из-за ошибки H2.

https://github.com/h2database/h2database/issues/2191

https://github.com/JetBrains/Exposed/issues/801

Комментарии:

1. Спасибо! Я решил эту проблему!