在 Room Dao 中将嵌入式实体的行加入到 POJO
Joining an Embedded Entity's row to POJO in Room Dao
我正在使用 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>>
}
很遗憾,我遇到了一个错误:
error: There is a problem with the query: [SQLITE_ERROR] SQL error or
missing database (no such column: bookentries.cg_id)
但是如果我删除内部联接,我会收到以下警告:
warning: at.guger.moneybook.data.model.BookEntry has some fields
[cg_id, cg_name] which are not returned by the query.
如何正确加入查询?
尝试:
@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>>
}
我正在使用 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>>
}
很遗憾,我遇到了一个错误:
error: There is a problem with the query: [SQLITE_ERROR] SQL error or missing database (no such column: bookentries.cg_id)
但是如果我删除内部联接,我会收到以下警告:
warning: at.guger.moneybook.data.model.BookEntry has some fields [cg_id, cg_name] which are not returned by the query.
如何正确加入查询?
尝试:
@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>>
}