带有复合主键的 Room @Relation

2024-05-04

我的问题是这个问题的延伸(也是我的:))->房间复合主键链接到外键 https://stackoverflow.com/questions/50248668/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;

}

But the 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>

当您测试 SQL 时,到实体 FullWorkOrder 的这种映射的行为就像表可视化上的数据库查询一样,您必须映射它,这样您就不会重复数据行或分配不正确的数据,具体取决于连接的复杂性。我建议将数据移动到键值映射,然后将所有数据连接在一起过滤重复的键。在这种情况下,我们将映射到我们在 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 以获得最新数据,请小心,我对此有过不好的经历。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带有复合主键的 Room @Relation 的相关文章

随机推荐

  • 使用 Admin SDK 将文件上传到 Firebase 存储

    根据Docs https cloud google com storage docs uploading objects storage upload object nodejs 我必须将文件名传递给函数才能上传文件 Uploads a l
  • 在达到 API 配额限制之前 YouTube 视频上传被拒绝

    我的项目的API配额通过申请过程成功增加到4M 通过以下方式在配额详细信息中确认了这一点 谷歌开发者控制台 https console developers google com已启用 API 的配额页面 然而 在标准的 50 次上传后 视
  • 使用 NDB 中的 Key 检索实体

    我有这样的结构 有章节的书籍 祖先 书 有页面 祖先 章节 我很清楚 要通过 ID 搜索章节 我需要通过祖先查询来搜索书籍 今天我了解到 如果我拥有所有密钥 我可以直接检索实体 而无需先获取书籍 然后获取章节 然后获取页面 如下所示 pag
  • 读取目标设备上 UIAutomation 的 UIAApplication.setPreferencesValueForKey() 设置的首选项?

    在过去的几天里 我一直在使用 Apple 的 UIAutomation 框架 试图组合一套验收测试来推动我正在开发的应用程序的开发 以 BDD 类型的方式 我遇到的一件事是如何让 SUT 进入给定状态 以便在我需要设置一些内部状态时可以开始
  • Eclipse CTRL+A、CTRL+E 转到行首 转到行尾

    I searched and was very surprised that I can t find a possibility to make CTRL A CTRL E work So I can jump to the beginn
  • 设置使用 pandas 绘图方法创建的图表上的 x 轴格式

    pandas DataFrame plot 是一种从数据帧绘制数据的便捷方法 但是 我不明白如何使用此方法格式化轴 例如 import pandas as pd import datetime df pd DataFrame index d
  • Web 服务代码不返回字符串数组

    我想从我的 Web 服务方法返回 abc xyz ghi tru 其中 是分隔符 形式的字符串数组 但是我做不到 这是我当前的网络服务代码 using System using System Collections using System
  • 在 Hyperledger Composer 中包含外部库文件

    有没有办法在 Hyperledger Composer 中包含外部库 我想用这个图书馆 http numeraljs com 用于货币计算 我在这看到post https stackoverflow com questions 446888
  • 使用 Caret 包的测试集的 ROC 曲线

    我正在尝试从测试集上的插入符号中获取最佳模型的 ROC 曲线 我碰到MLeval包似乎很方便 输出非常全面 使用几行代码提供了所有需要的指标和图表 一个很好的例子在这里 https stackoverflow com a 59134729
  • LogCat 不显示标签“SMS”

    Override public void onCreate Bundle savedInstanceState super onCreate savedInstanceState setContentView R layout main L
  • 如何防止在 CSS 中调整图像大小?

    我有以下代码来创建图像库 他们需要做出反应 但问题是 当窗口宽度发生变化时 图像也会调整大小并失去纵横比 我怎样才能解决这个问题 我是 CSS 新手 padding 0 margin 0 HEADER STYLES header width
  • 垂直和水平平行度

    最近在并行领域工作 我了解到有两个术语 垂直并行 和 水平并行 有人说openmp 共享内存并行 是垂直并行 而mpi 分布式内存并行 是水平并行 为什么这些术语这么称呼 我不明白原因 这么称呼它们只是术语吗 这些术语似乎没有被广泛使用 也
  • 如何重定向Python中包含的类的所有方法?

    如何实现组合模式 我有课Container它有一个属性对象Contained 我想重定向 允许访问所有方法Contained班级来自Container只需调用my container some contained method 我是否以正确
  • SQLAlchemy TypeDecorator 不起作用

    我在用着xml在我的 postgresql 数据库中 我需要一个可以处理的自定义类型xmlSQLAlchemy 中的数据 所以我做了XMLType班级与xml etree 但它并没有按照我的意愿工作 这是我写的代码 import xml e
  • 如何减小heroku slug的大小?

    我的 slug 大小为 89 5MB 非常大 然而 存储库的大小非常小 du hsc 8 0M 8 0M total 继这篇博文之后 http dazedthots blogspot com 2011 07 reducing slug si
  • 数据库无法检索图像或为空,导致数组错误。如何修复它?

    我的问题是java lang IndexOutOfBoundsException 无效索引 0 大小为 0 我不知道如何修复此错误 并且我的阵列上没有发现任何问题 我是安卓新手 希望大家理解 也许这是我的错误的原因value put KEY
  • 我是否必须注册新的捆绑包 ID 才能将新应用程序上传到 iTune Connect?

    这是我第一次将应用程序上传到 iTunes Connect 这让我感到害怕 捆绑包 ID 的选择似乎只是一种选择 Xcode iOS 通配符应用程序 ID 下面有一行 你可以注册一个新的bundle id 问题是 我需要注册一个新的bund
  • 最大流量算法的修改

    我试图解决一个关于最大流量问题 http en wikipedia org wiki Maximum flow problem 我有一个源和两个接收器 我需要找到该网络中的最大流量 这部分是一般的最大流量 然而 在这个特殊版本的最大流量问题
  • 用于存储应用程序用户机密的 Azure Key Vault 机密

    在我的应用程序中 我必须存储用户的非常敏感的数据 例如其他第三部分服务的各种密码 用户填写一个表格 向我们提供第三部分服务的登录名和密码 该应用程序的目标是使用从 100 多个输入生成的 powershell 脚本来设置其他复杂系统 需要将
  • 带有复合主键的 Room @Relation

    我的问题是这个问题的延伸 也是我的 gt 房间复合主键链接到外键 https stackoverflow com questions 50248668 room composite primary key link to foreign k