gpt4 book ai didi

android - Room @Relation 与复合主键

转载 作者:IT王子 更新时间:2023-10-29 06:20:57 24 4
gpt4 key购买 nike

我的问题是这个问题的延伸(也是我的:))-> Room composite Primary Key link to Foreign Key所以,如果我有这个类:

public class FoodWithIngredients extends Food{

@Relation(parentColumn = "id", entityColumn = "food_id", entity =
Ingredient.class)
private List<Ingredient> mIngredients;

}

但是 PrimaryKey “食物”表的 composite (primaryKeys = {"id", "language_id"}) .

如何使@Relation 返回"parentColumn = {"id", "language_id"}, entityColumn = {"food_id", food_language_id}" 处的记录?

最佳答案

注解@Relation 仍然不提供对复合主键的支持。

获取查询多个表的数据以保持表清洁的最简单方法是使用@Embedded 注释。如果你不介意变脏,你可以添加一个额外的字段,你可以在该字段上使用 @Relation 连接主键的字段,维护字段的所有风险以及对其数据的潜在错误比较。可能值得,我不知道这看起来是个坏主意。

所以干净的解决方案。提供下表。

//Multiple Staff and Machine can participate on a WorkOrder and they do hours of work related to it

@Entity
data class Staff(
@PrimaryKey val jdeNumber: String,
val idNfc: String,
val staffDescription: String,
val triadorNumber: String,
val approverId: Int)

@Entity(primaryKeys = ["machineId"])
data class Machine(
val machineId: String,
val machineNumber: String,
val machineDescription: String,
val machineNumberAux: String,
val manufacturer: String,
val model: String,
val productionNumber: String,
val hasHours: Boolean)

//A WorkOrder may have staff, machine or both
@Entity
data class WorkOrder(
@PrimaryKey val woId: String,
val date: Long,
val comments: String = "",
val userId: String,
val partStatus: Int
)

//Embedded annotation creates all the fields from the entity inside these tables and add to the field name a prefix, then when we join tables we have no name conflict
@Entity(
primaryKeys = ["woIdStaff", "wo_jdeNumber"],
foreignKeys = [
ForeignKey(entity = WorkOrder::class,
parentColumns = ["woId"],
childColumns = ["woIdStaff"],
onUpdate = ForeignKey.CASCADE,
onDelete = ForeignKey.RESTRICT)]
)
data class WorkOrderStaff(
val woIdStaff: String,
@Embedded(prefix = "wo_")
val staff: Staff,
val hourFrom: Long,
val hourTo: Long,
val hoursUsed: Long
)

@Entity(
primaryKeys = ["woIdMachine", "wo_machineId"],
foreignKeys = [
ForeignKey(entity = WorkOrder::class,
parentColumns = ["woId"],
childColumns = ["woIdMachine"],
onUpdate = ForeignKey.CASCADE,
onDelete = ForeignKey.RESTRICT)]
)
data class WorkOrderMachine(
val woIdMachine: String,
@Embedded(prefix = "wo_")
val machine: Machine,
val hourFromMachine: Long,
val hourToMachine: Long,
val hoursUsedMachine: Long
)

//Important this entity is the one that maps from JOIN queries
data class FullWorkOrder(
@Embedded
val workOrder: WorkOrder
@Embedded
val staff: WorkOrderStaff?
@Embedded
val machine: WorkOrderMachine?
)

然后我们要查询所有工作订单以及在其中工作的员工和机器以及每个工作的时间。所以我们在 Dao 中写了一个查询。

@Query("select * from WorkOrder LEFT JOIN WorkOrderStaff ON woId = woIdStaff LEFT JOIN WorkOrderMachine ON woId = woIdMachine")
abstract fun getAllFullWorkOrders(): List<FullWorkOrder>

此映射到实体 FullWorkOrder 的行为类似于表可视化上的 Db 查询,当您测试 SQL 时,您必须映射它,这样您就不会复制数据行或分配不正确的数据,具体取决于连接的复杂性。我建议将数据移动到键值映射,然后将所有数据合并在一起过滤重复的键。在这种情况下,我们将映射到我们在 UI -> DomainWorkOrder 上使用的实体。

data class DomainWorkOrder(
val id: String,
.
.
.
val staffList: List<StaffRow>
val machineList: List<MachineRow>
)

我已经从示例中删除了我正在使用的表的真正复杂性,这就是为什么您在 SQL 上看不到任何复合 LEFT JOIN 的原因。我有 8 个表附加到 WorkOrder(1-n),其中 2 个嵌套在其中 1-n 关系中。我保证这在大多数情况下都能解决问题,如果您尝试将 Staff 表加入实体 FullWorkOrder 以获取最新数据,请小心,我对此有不好的体验。

我知道它不是纯粹的,但模式受到尊重,查询/映射过程不需要大量工作和维护。希望对您有所帮助!!

关于android - Room @Relation 与复合主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50350741/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com