Kotlin暴露选择所有位置

dldeef67  于 2023-01-31  发布在  Kotlin
关注(0)|答案(1)|浏览(93)

我需要使用公开的where查询来实现selectAll()
下面是我代码:

suspend fun getAll(
    page: Int, size: Int, keyword: String = ""
): List<DTO> = suspendableQuery {
    table.selectAll()
        .limit(size, page.toLong())
        .andWhere(searchCondition(keyword))
        .map(::toDTO)
}
fun searchCondition(keyword: String): 
    SqlExpressionBuilder.() -> Op<Boolean> = {
        if (keyword.isNotEmpty()) (UserTable.phone eq keyword) or 
    (UserTable.name eq keyword) else Op.TRUE
}

不管我在keyword参数中放入空字符串还是单词,它都不起作用,结果是空列表。
问题是如何在公开kotlin情况下实现search特性。

dgenwo3n

dgenwo3n1#

我为自己写的。我创建了扩展函数

fun <T> Query.addAndOp(param: T?, opBuilder: (T) -> Op<Boolean>): Query {
    return if (param != null) andWhere { opBuilder(param) } else this
}

加上我的参数

private fun Query.buildWhere(
    text: String? = null,
    language: String? = null,
    country: String? = null
): Query {
    return andWhere { PhraseTable.ban eq false }
        .addAndOp(text) { PhraseTable.phrase.lowerCase().like("%${it.lowercase()}%") }
        .addAndOp(language) { PhraseTable.lang eq it }
        .addAndOp(country) { PhraseTable.country eq it }
}

在这里用过。

fun count(
    text: String? = null,
    language: String? = null,
    country: String? = null
) = transaction {
    val query = PhraseTable
        .slice(PhraseTable.id.countDistinct())
        .selectAll()
        .buildWhere(text, language, country)

    return@transaction query.first()[PhraseTable.id.countDistinct()]
}

相关问题