首页 > 解决方案 > JetBrains Exposed (DSL Api):使用 .regexp() where 条件时出现问题

问题描述

我正在使用 Javalin & Exposed ORM 构建一个小型 API。我正在尝试使用正则表达式 where 条件但抛出异常,因为由于我的代码执行的 SQL 查询似乎不完整(模式丢失)。

fun getUsersByFilter(filter: String): List<User> {
    val regex = StringBuilder("/")
            .append(filter.toLowerCase())
            .append("/i")
            .toString()


    /**
     * The .regexp(someString) method take a string as argument (a pattern)
     */
    val users = transaction {
        User.find{ Users.pseudo.regexp(regex)  }.toList()
    }

    return users
}
  Position : 141. Statement(s): SELECT users.id, users.pseudo, users.email, users."password", users.admin, users.created_at, users.updated_at FROM users WHERE users.pseudo REGEXP ?
org.jetbrains.exposed.exceptions.ExposedSQLException: org.postgresql.util.PSQLException: ERREUR: erreur de syntaxe sur ou près de « REGEXP »
  Position : 141
SQL: [SELECT users.id, users.pseudo, users.email, users."password", users.admin, users.created_at, users.updated_at FROM users WHERE users.pseudo REGEXP ?]

有人能帮助我吗?

标签: regexkotlinormkotlin-exposedjavalin

解决方案


好的我明白了。即使在使用 StringBuilder 时,正则表达式参数也已正确传递给查询(异常消息中的问号只是指向参数...)。该错误来自 PostgreSQL,因为 PostgreSQL 中根本不存在“REGEXP”函数......

我终于使用了这段代码:

    fun getUsersByFilter(filter: String): List<User> {
        val regex = "%${filter.toLowerCase()}%"

        val users = transaction {
            User.find{ Users.pseudo.lowerCase().like(regex) }.toList()
        }

        return users
    }

推荐阅读