3

エンコーディングの問題を解決しようとしました。そこで、「Postman」から Web ブラウザのリクエストからサーバーに送信し、リクエストのキーでデータベース内のデータを検索しました。リクエストは次のようになります。

http://localhost:8080/books.getBooksByGenre/Документальное/0/10

(ブラウザで)。サーバーは次のような文字列を受け取ります

http://localhost:8080/books.getBooksByGenre/%D0%94%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5/0/10

次に、url: ジャンル名: 'Документальное' start: 0 count: 10 からパラメーターを取得します。次に、このデータが dao に送信されます。

override fun findGenreByName(genreName: String): DatabaseGenre {
    return transaction(db) { getGenreByName(genreName) }
}

private fun getGenreByName(genreName: String): DatabaseGenre {
    return try {
        val foundGenre = GenreEntity.find { Genres.genre eq genreName }.single()
        DatabaseGenre(foundGenre.id.value, foundGenre.genre, foundGenre.link)
    } catch (e: Exception) {
        throw NothingFoundInDatabaseException("no one genre found by '$genreName'")
    } catch (e: NoSuchElementException) {
        val m = "Duplicates of genre with name '$genreName'"
        throw DuplicatedDataInDatabaseException(m)
    }
}

ログを見ると、ジャンルを見つけるための sql-query は正しいのですが、例外が発生します。

java.util.NoSuchElementException: Collection is empty.

私が言ったように、SQLクエリは正しいです:

SELECT genres.id, genres.genre, genres.link FROM genres WHERE genres.genre = 'Документальное'

ジャンル テーブルの構造:

genres id: int(10) genre: varchar(100) link: varchar(100

すべてのジャンルを選択しようとしましたが、このクエリはほぼ正しく実行されました。そこで、このクエリを英単語でチェックすることにしました。このクエリは正しく実行されました。

SELECT genres.id, genres.genre, genres.link FROM genres WHERE genres.genre = 'simpleGenre'

このクエリには例外はありません。

それで、私が間違っていたことと、照合の問題を修正する方法は?

UPD: github ( issue ) で言ったように、このクエリを mysql cli で試してみたところ、正しい答えが返ってきました。

また、(Java URLDecoder クラスを使用して) URL パラメータをデコードしようとしました。それも役に立ちません。

4

1 に答える 1

3

ありがとう、@マッドヘッド。@madhead の進歩を試してみましたが、うまくいきました。したがって、今回から私の DB 接続 URL は次のようになります。

val connect = Database.connect(
        url = "jdbc:mysql://localhost:3306/my_database_name?characterEncoding=utf8&useUnicode=true",
        driver = "com.mysql.jdbc.Driver",
        user = user_name,
        password = password
)
于 2018-11-22T21:51:13.087 に答える