Home > OS >  kotlin exposed failed (insert is successful, but select is failure)
kotlin exposed failed (insert is successful, but select is failure)

Time:10-05

thanks reading this question.

I created simple kotlin project and I want to learn kotlin exposed.

I use H2 database.

I wrote code like below.

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()
    }
}

and sql files below.

create table author (name varchar(30));

insert into author values ('author1');

When execute main(), console showing insert done.. in short, I think insert is doing well, but when execute AuthorTable.selectAll().firstOrNull(), happend Exception like below,

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)

can I solve this? do you know something how to solve this?

thanks.

CodePudding user response:

Seems like you need at least one Primary Key(PK) or Constraint because of H2 bug.

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

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

  • Related