java - 如何使用带有FK的表在查询室中获取完整的实体对象

标签 java android sql kotlin android-room

假设我有这些表:
表-用户

Stores the users

@Entity(
    tableName = "USER"
)
data class User(
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "user_id")
    val id: Int,

    @ColumnInfo(name = "user_name")
    val name: String
)
表-项目

Store the items it's like a product

@Entity(
    tableName = "ITEM"
)
data class Item(
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "item_id")
    val id: Int,

    @ColumnInfo(name = "item_name")
    val name: String,

    @ColumnInfo(name = "item_description")
    val description: String
)

表-特殊

Store an speciality for product 1 Special needs a Product to exist

@Entity(
    tableName = "SPECIAL",
    foreignKeys = [ForeignKey(
        entity = Item::class,
        parentColumns = ["item_id"],
        childColumns = ["special_item_id"]
    )]
)
data class Special(
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "special_id")
    val id: Int,

    @ColumnInfo(name = "special_item_id")
    val coupon_product_id: Int,

    @ColumnInfo(name = "special_name")
    val name: String,

    @ColumnInfo(name = "special_description")
    val description: String

)

表-最喜欢的

Stores the favourite Specials from an user

@Entity(
    tableName = "TB_FAVOURITE",
    foreignKeys = [ForeignKey(
        entity = User::class,
        parentColumns = ["user_id"],
        childColumns = ["favourite_user_id"]
    ), ForeignKey(
        entity = Special::class,
        parentColumns = ["special_id"],
        childColumns = ["favourite_special_id"]
    )]
)
data class Favourite(
    @PrimaryKey
    @ColumnInfo(name = "favourite_user_id")
    val id: Int,

    @ColumnInfo(name = "favourite_special_id")
    val specialId: Int

)
我的问题是,如何查询以选择所有的Specials,然后创建类似于存储用户是否喜欢的类的类。目前,这是一个用户应用程序,是一个演示应用程序。因此,用户将始终相同,因此我可以对findById进行硬编码并发送用户ID。
目标
是获取查询结果的列表,其中包含:
  • 所有特价商品
  • 在SomeClass中应在
  • 内包含Special的项目
  • 一个标志,以了解它是否是该驱动程序的最爱

  • 问题是我希望能够将 session 室数据库的结果映射到所需的对象,因此我想查询比映射器更重要,我知道该怎么做。
    请注意,我使用的是assets/database/mydb.db文件来启动数据库,我不知道这是否重要。
    查询将如何做到这一点? db的结构是否有任何改进以使其更容易?

    最佳答案

    您可以这样创建类:

    class SpecialWithFavourite {
        @Embedded
        var special: Special? = null
        @Relation(parentColumn = "special_item_id", entityColumn = "item_id")
        var item: Item? = null
        @Relation(parentColumn = "special_id", entityColumn = "favourite_special_id")
        var favourite: Favourite? = null
    }
    
    然后使用dao查询将其提取如下:
    @Dao
    interface DaoSpecialWithFavourite {
        @Transaction
        @Query("SELECT SPECIAL.* FROM SPECIAL INNER JOIN TB_FAVOURITE WHERE TB_FAVOURITE.favourite_user_id = :userId")
        fun getLD(userId: Long): List<SpecialWithFavourite>
    }
    
    另一种选择是使用View,特别是如果您只需要几个字段时
    @DatabaseView("SELECT SPECIAL.*, ITEM.item_name FROM SPECIAL INNER JOIN ITEM ON ITEM.item_id = SPECIAL.special_item_id")
    class FavSpecial {
        var name: String? = null
        @Embedded
        var special: Special? = null
    }
    
    根据评论中的讨论,新Favourite
    data class Favourite(
        @PrimaryKey(autoGenerate = true)
        val id: Int,
        @ColumnInfo(name = "favourite_user_id")
        val userid: Int,
        @ColumnInfo(name = "favourite_special_id")
        val specialId: Int
    )
    
    这样,您仍然可以保留约束,并且用户可以拥有多个喜欢的特价商品

    关于java - 如何使用带有FK的表在查询室中获取完整的实体对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63468069/

    相关文章:

    php - MySQL需要设置外键吗?

    java - 所有节点上的密码索引公共(public)属性

    Java,如何检测对象的属性何时发生变化

    java - 将天转换为小时 :minutes:second java

    android - 如何编写代码为 android 中的数组创建共享首选项?

    android - fragment 真的需要一个空的构造函数吗?

    sql - 如何创建查询以获取日期之间的发票(需要帮助)

    macos - 是否可以在生产中获取并运行 JDK 7?

    java - 从 JSON 获取数据

    mysql - 新手 SQL : How to fetch rows *not* included in another table?