kotlin - Kotlin公开-基于子查询计数进行选择

标签 kotlin kotlin-exposed

在我的数据模型中,挑战白名单项目之间存在非常简单的一对多关系。

我正在尝试选择按白名单过滤的挑战。基本上,挑战选择标准是当挑战本身在白名单中没有任何条目或白名单按名称匹配时。

这可以通过非常简单的SQL查询来实现:

select c.* from challenge c, challenge_whitelist w where (c.id = w."challengeId" and w."userName" = 'testuser') or ((select count(*) where c.id = w."challengeId") = 0);

我无法将其翻译为Exposed:
  // will not compile
  fun listAll(userName: String) {
    ExposedChallenge.wrapRows(
      ChallengeTable.innerJoin(ChallengeWhitelistTable)
        .slice(ChallengeTable.columns)
        .select((ChallengeWhitelistTable.userName eq userName) or (ChallengeTable.innerJoin(ChallengeWhitelistTable).selectAll().count() eq 0))
    ).toList()
  }

用户名检查可以正常工作,但是ChallengeTable.innerJoin(ChallengeWhitelistTable).selectAll().count() eq 0)不符合有效表达式的要求(无法编译)。

请注意,映射是非常简单的:
object ChallengeTable : IntIdTable() {
  val createdAt = datetime("createdAt")
}

class ExposedChallenge(id: EntityID<Int>) : IntEntity(id) {
  companion object : IntEntityClass<ExposedChallenge>(ChallengeTable)
  var createdAt by ChallengeTable.createdAt
  val whitelist by ExposedChallengeWhitelist referrersOn ChallengeWhitelistTable.challenge
}

object ChallengeWhitelistTable : IntIdTable(name = "challenge_whitelist") {
  var userName = varchar("userName", 50)
  var challengeId = integer("challengeId")
  val challenge = reference("challengeId", ChallengeTable).uniqueIndex()
}

class ExposedChallengeWhitelist(id: EntityID<Int>) : IntEntity(id) {
  companion object : IntEntityClass<ExposedChallengeWhitelist>(ChallengeWhitelistTable)

  val challengeId by ChallengeWhitelistTable.challengeId
  val challenge by ExposedChallenge referencedOn ChallengeWhitelistTable.challenge
}

任何帮助,将不胜感激。

最佳答案

您的SQL查询无效,因为您使用了没有select count(*)部分的from
但是它可以用暴露的DSL重写,例如:

ChallengeTable.leftJoin(ChallengeWhitelistTable).
    slice(ChallengeTable.columns).
    selectAll().
    groupBy(ChallengeTable.id, ChallengeWhitelistTable.userName).having {
    (ChallengeWhitelistTable.userName eq "testUser") or
    (ChallengeWhitelistTable.id.count() eq 0)
}

另一种方法是使用左连接:
ChallengeTable.leftJoin(ChallengeWhitelistTable).
    slice(ChallengeTable.columns).
    select {
        (ChallengeWhitelistTable.userName eq "testUser") or
        (ChallengeWhitelistTable.id.isNull())
    }

关于kotlin - Kotlin公开-基于子查询计数进行选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58057204/

相关文章:

google-cloud-sql - 如何通过Expedia连接到Google Cloud SQL

sql - Kotlin 公开 - 没有标识列的表的实体

kotlin - 有没有办法声明第三方库 kotlin 类的范围扩展?

Kotlin 暴露 : How to create prepared statement or avoid SQL Injection?

MySQL 使用 Kotlin 连接表暴露错误 : "no matching primary/foreign key pair"

kotlin - 获取列表 kotlin 范围之间的项目

javafx - 如何使此 JavaFX 绑定(bind)多次触发?

java - 安卓错误: Attempt to invoke virtual method 'java.lang.String android.content.Intent.getStringExtra(java.lang.String)' on a null object reference

Android kotlin NestedScrollView 不在 CoordinatorLayout 中滚动整个内容

java - proguard 规则不适用于某些 Java 文件