Java 如何使用带有FK的表通过查询室获取完整的实体对象

Java 如何使用带有FK的表通过查询室获取完整的实体对象,java,android,sql,kotlin,android-room,Java,Android,Sql,Kotlin,Android Room,假设我有这些表格: 表-用户 存储用户 表-项目 储存物品,就像产品一样 表-特殊 存储产品1的特殊需要产品存在 桌上最爱 存储用户最喜爱的特价商品 我的问题是,我如何进行查询以选择所有特价商品,然后创建一个类来存储用户是否喜欢的商品。目前它是一个用户应用程序,是一个演示应用程序。所以,用户总是相同的,这样我就可以硬编码findById并发送用户的id 目标 是获取查询结果作为列表,其中包含: 所有的特色菜 在SomeClass中,应该包含特殊内部的项 一个标志,以知道它是否是该车手的最爱 问题

假设我有这些表格:

表-用户 存储用户

表-项目 储存物品,就像产品一样

表-特殊 存储产品1的特殊需要产品存在

桌上最爱 存储用户最喜爱的特价商品

我的问题是,我如何进行查询以选择所有特价商品,然后创建一个类来存储用户是否喜欢的商品。目前它是一个用户应用程序,是一个演示应用程序。所以,用户总是相同的,这样我就可以硬编码findById并发送用户的id

目标 是获取查询结果作为列表,其中包含:

所有的特色菜 在SomeClass中,应该包含特殊内部的项 一个标志,以知道它是否是该车手的最爱 问题是我希望能够将房间数据库的结果映射到我想要的对象,所以我猜查询比映射器更重要,我知道如何进行映射

注意,我正在使用assets/database/mydb.db文件启动数据库,我不知道这是否重要


查询将如何做到这一点?数据库的结构是否有任何改进以使其更简单?

您可以创建如下类:

特别班,最喜欢的{ @嵌入 特殊变量:特殊?=null @RelationparentColumn=special\u item\u id,entityColumn=item\u id 变量项:项?=null @RelationparentColumn=special\u id,entityColumn=Favorite\u special\u id var favorite:favorite?=null } 然后使用dao查询将其提取,如下所示:

@刀 界面DaoSpecialWithFavorite{ @交易 @QuerySELECT SPECIAL.*从特殊内部加入TB\u favorite,其中TB\u favorite.favorite\u user\u id=:userId fun getLDuserId:Long:List } 另一种选择是使用,特别是当您只需要五个字段时

@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
}
根据评论中的讨论,新宠儿


这样,您仍然可以保留约束,并且用户可以有多个喜爱的特价菜

您可以创建如下类:

特别班,最喜欢的{ @嵌入 特殊变量:特殊?=null @RelationparentColumn=special\u item\u id,entityColumn=item\u id 变量项:项?=null @RelationparentColumn=special\u id,entityColumn=Favorite\u special\u id var favorite:favorite?=null } 然后使用dao查询将其提取,如下所示:

@刀 界面DaoSpecialWithFavorite{ @交易 @QuerySELECT SPECIAL.*从特殊内部加入TB\u favorite,其中TB\u favorite.favorite\u user\u id=:userId fun getLDuserId:Long:List } 另一种选择是使用,特别是当您只需要五个字段时

@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
}
根据评论中的讨论,新宠儿


这样,您仍然可以保留限制条件,用户可以有多个喜爱的特价菜

请查看。当你使用它时,你可以用@Stachu定义连接,你可以添加一个例子作为答案吗。当你使用它时,你可以用@Stachu定义连接。你可以添加一个例子作为答案吗?我在尝试插入Failureandroid.database.sqlite.SQLiteConstraintException时遇到问题。异常:唯一约束失败:TB_Favorite.Favorite_用户id代码1555 sqlite_constraint_PrimaryKey我是否创建了Favorite表?使用该主键?对于Favorite主键,它是受user.user\u id约束的Favorite\u user\u id,因此每个用户只能有一个。它是不是被涂上了油漆?我会为该表创建一个单独的键,特别是允许用户拥有多个收藏夹。不,我想成为一个可以找到例如用户1作为收藏夹2、3、4的表,所以第一列是用户id,可以是数据库的任何用户id,收藏夹需要是特殊的id。但我需要在那里添加一个PK。。。所以我不知道两者是否都必须是PK或什么。但可能存在多个不同的用户id。我在尝试插入时遇到问题,Failureandroid.database.sqlite.SQLiteConstraintException:唯一约束失败:TB_Favorite.Favorite_用户id代码1555 sqlite_constraint_PrimaryKey我是否创建了Favorite表?使用该主键?对于Favorite主键,它是受user.user\u id约束的Favorite\u user\u id,因此每个用户只能有一个。它是不是被涂上了油漆?我会为该表创建一个单独的键,特别是允许用户拥有多个收藏夹。不,我想成为一个可以找到例如用户1作为收藏夹2、3、4的表,所以第一列是用户id,可以是数据库的任何用户id,收藏夹需要是特殊的id。但我需要在那里添加一个PK。。。所以我不知道两者是否都必须是PK或什么。但可能存在不止一个不同的用户id。
@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

)

@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

)
@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
}
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
)