【问题标题】:One-to-many with lightweight many一对多与轻量级多
【发布时间】:2020-12-11 23:41:27
【问题描述】:

Room 允许您使用仅包含这些列的 POJO 查询特定列。 (顺便说一句,如果属性名与列名匹配,@ColumnInfo 是必要的吗?)

文档示例:

data class NameTuple(
    @ColumnInfo(name = "first_name") val firstName: String?,
    @ColumnInfo(name = "last_name") val lastName: String?
)

// In DAO:
@Query("SELECT first_name, last_name FROM user")
fun loadFullName(): List<NameTuple>

在进行一对多查询时,有没有办法从依赖实体中仅选择一部分列?文档中的所有关系示例都显示了将实体类组合成一个 POJO 链接实体类的 POJO,但不是像上面那样的非实体元组之一。

如何告诉它在@Transaction 的第二个隐式查询中选择哪些列?

我什至不知道从哪里开始设置,也不知道查询代码是什么。举例来说,假设您有一个 Person 表和 Pet 表,并且您希望能够获取所有带有宠物名称的 Person 流,但没有其他宠物数据。

@Entity
data class Person(
    @PrimaryKey(autoGenerate = true) val id: Int = 0,
    val name: String = ""
)

@Entity
data class Pet(
    @PrimaryKey(autoGenerate = true) val id: Int = 0,
    val ownerId: Int = 0,
    val name: String = "",
    val animalType: String = "",
    val birthdate: Long = 0
)

// ...

data class PetName (
    @ColumnInfo(name = "id") val id: Int = 0,
    @ColumnInfo(name = "name") val name: String = ""
)

PersonWithPetsNames {
    @Embedded val person: Person,
    @Relation(parentColumn = "id", entityColumn = "ownerId", entity = Pet::class)
    val pets: List<PetName>
}

// in DAO:
@Transaction
@Query("SELECT * FROM Person ...???")
fun getPeopleWithPetNames(): Flow<List<PersonWithPetsNames>>

【问题讨论】:

    标签: java android kotlin android-room


    【解决方案1】:

    在 JPA 中,您可以选择任何列来构建实体。通常,您可以使用 EntityGraph 来控制要获取的实体(和属性)图。 JPA 是 java 标准,您可以在 android、java 服务器端或 swing 项目上重用代码。请参阅适用于 Android 的 Cmobilecom-JPA。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-10
      • 2010-12-03
      • 1970-01-01
      • 2012-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-16
      相关资源
      最近更新 更多