首页 > 解决方案 > 如何使用连接表检查房间查询中的空参数?

问题描述

我正在尝试使用带有 SQLite 的 Room 库和带有此查询的 kotlin 获取数据,但我有 2 个可空参数与连接表,我不知道如何检查它们是否为空。我想看看它们是否为 null,然后返回 null,如果它们不为 null,则返回参数,但我正在使用此查询 RN,问题是查询仅在所有参数(甚至可为 null 的参数)不为 null 时才返回数据。这是我的查询

@Query(
        "SELECT " +
                "f.word AS from_word, " +
                "f.word_id as from_word_id, " +
                "f2.word AS from_word2, " +
                "f2.word_id as from_word_id2, " +
                "fl.language AS from_language, " +
                "fl.language_id AS from_language_id, " +
                "t.word AS to_word, " +
                "t.word_id AS to_word_id, " +
                "t2.word AS to_word2, " +
                "t2.word_id AS to_word_id2, " +
                "tl.language AS to_language, " +
                "tl.language_id AS to_language_id, " +
                "time, " +
                "date, " +
                "day_of_week AS dayOfWeek, " +
                "country, " +
                "city, " +
                "bookmarked " +
                "FROM word_translate_map " +
                "JOIN word AS f ON from_word_map = f.word_id " +
                "JOIN word AS t ON to_word_map = t.word_id " +
                "JOIN word AS f2 ON from_word_map2 = f2.word_id " +
                "JOIN word AS t2 ON to_word_map2 = t2.word_id " +
                "JOIN language AS fl ON f.language_map = fl.language_id " +
                "JOIN language AS tl ON t.language_map = tl.language_id "
    )
    abstract fun getAllTranslatedWords(): LiveData<List<TranslatedWord>>

这是我的桌子,我有问题。

@Entity(
    tableName = "word_translate_map",
    primaryKeys = ["from_word_map","to_word_map"],
    foreignKeys = [
        ForeignKey(
            entity = Word::class,
            parentColumns = ["word_id"],
            childColumns = ["from_word_map"],
            onDelete = ForeignKey.CASCADE,
            onUpdate = ForeignKey.CASCADE
        ),
        ForeignKey(
            entity = Word::class,
            parentColumns = ["word_id"],
            childColumns = ["to_word_map"],
            onDelete = ForeignKey.CASCADE,
            onUpdate = ForeignKey.CASCADE
        )
    ],
    indices = [
        Index("to_word_map")
    ]
)
data class WordTranslateMap(
    @ColumnInfo(name = "from_word_map")
    val fromWord: Long,
    @ColumnInfo(name = "to_word_map")
    val toWord: Long,

    @ColumnInfo(name = "from_word_map2")
    val fromWord2: Long?,
    @ColumnInfo(name = "to_word_map2")
    val toWord2: Long?,

    @ColumnInfo(name = "time")
    val time: String,
    @ColumnInfo(name = "date")
    val date: String,
    @ColumnInfo(name = "country")
    val country: String,
    @ColumnInfo(name = "city")
    val city: String,
    @ColumnInfo(name = "day_of_week")
    val dayOfWeek: String,
    @ColumnInfo(name = "bookmarked")
    val bookmarked: Boolean
)

这也是我的模型(如果你需要这个)

data class TranslatedWord(
    val from_word: String,
    val from_word2: String?,
    val from_language: String,
    val to_word: String,
    val to_word2: String?,
    val to_language: String,
    val time: String,
    val date: String,
    val country: String,
    val city: String,
    val dayOfWeek: String,
    val bookmarked: Boolean
)

标签: androidsqliteandroid-room

解决方案


我认为您可以对连接进行双重验证,是否可以在哪里选择所有为空或匹配条件的字段,例如:

WHERE (:t2 IS NULL OR :t2 = :t1)

我的猜测是您可以在连接上实现相同的操作,例如:

JOIN word AS f ON (from_word_map = f.word_id OR from_word_map IS NULL)

您可以执行进一步的验证(例如检查两个字段是否为空以确实返回空)嵌套和。


推荐阅读