【问题标题】:Joining an Embedded Entity's row to POJO in Room Dao将嵌入式实体的行加入到 Room Dao 中的 POJO
【发布时间】:2018-12-29 16:23:43
【问题描述】:

我正在使用 Room Persistance Library (v2.0.0) 查询 POJO。我将所有这些实体放在不同的表中(书目、类别……)。 我正在尝试将 BookEntryEntity 与与 BookEntry 的category_id 匹配的类别结合起来。

class BookEntry(
        @Embedded var entity: BookEntryEntity = BookEntryEntity(),
        @Embedded(prefix = 'cg_') var category: Category? = null,
        contacts: List<Contact.ContactEntity>? = null
) : Parcelable {

    @Relation(
            entity = Contact.ContactEntity::class,
            parentColumn = 'id',
            entityColumn = 'bookentry_id'
    )
    var embeddedContacts: List<Contact.ContactEntity>? = contacts

    //...

    @Entity(tableName = 'bookentries')
    data class BookEntryEntity(
            @PrimaryKey(autoGenerate = true) @ColumnInfo(name = 'id') var id: Long = 0,
            @ColumnInfo(name = 'title') var title: String = "",
            @ColumnInfo(name = 'date') var date: Date = Date(),
            @ColumnInfo(name = 'value') var value: Double = 0.0,
            @ColumnInfo(name = 'notes') var notes: String = "",
            @ColumnInfo(name = 'entrytype') var entryType: Int = Type.Earning,
            @ColumnInfo(name = Reference.CATEGORY_ID) var categoryId: Long? = null
    )

}

嵌入式实体Category 不会自动加入。

@Entity(tableName = 'categories')
data class Category(@PrimaryKey(autoGenerate = true) @ColumnInfo(name = 'id') val id: Long = 0, @ColumnInfo(name = 'name') var name: String = "")

我尝试通过以下方式加入:

@Dao
interface BookEntryDao {

    @Transaction
    @Query("SELECT * FROM bookentries INNER JOIN categories ON bookentries.cg_id = categories.id WHERE categories.id == bookentries.category_id ORDER BY bookentries.date DESC")
    fun getBookEntries(): LiveData<List<BookEntry>>
}

很遗憾,我遇到了一个错误:

错误:查询有问题:[SQLITE_ERROR] SQL 错误或 缺少数据库(没有这样的列:bookentries.cg_id)

但如果我删除内部连接,我会收到以下警告:

警告:at.guger.moneybook.data.model.BookEntry 有一些字段 查询未返回的 [cg_id, cg_name]。

如何正确加入查询?

【问题讨论】:

    标签: android android-sqlite inner-join android-room


    【解决方案1】:

    试试:

    @Dao
    interface BookEntryDao {
    
        @Transaction
        @Query("SELECT * FROM bookentries INNER JOIN categories ON bookentries.category_id = categories.id ORDER BY bookentries.date DESC")
        fun getBookEntries(): LiveData<List<BookEntry>>
    }
    

    【讨论】:

    • 这不是我要找的,我有正确的 category_id 的 BookEntryEntity,但我想在此事务中从另一个表加载类别信息(名称)。请看一下我编辑的帖子。
    • 这就是这条 SQL 语句的作用:/。 BookEntry 类不是实体,所以在使用@Embedded 时,我会删除前缀值。
    • 哦,好的,谢谢,我的错...但是现在还有另一个警告:查询返回了一些列 [name] 不被 at.guger.moneybook.data.model.BookEntry 使用。您可以在字段上使用 @ColumnInfo 注释来指定映射。 at.guger.moneybook.data.model.BookEntry 有一些字段 [cg_id, cg_name] 不由查询返回。你有办法解决这个问题吗?
    • 您可以 1. 别名类别列例如SELECT bookentries.*, categories.id as cg_id, [other columns...] FROM bookentries INNER JOIN categories ON bookentries.category_id = categories.id ORDER BY bookentries.date DESC 或 2. 从 @Embedded 中删除前缀 = 'cg_'。
    猜你喜欢
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多