假设我有这些表:
表-用户
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。目标
是获取查询结果的列表,其中包含:
问题是我希望能够将 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/