我有一个包含商店及其销售商品的父表。然后,我有一个子表,其中包含商店中每种商品的销售单位。我想要一个公开的
DAO entity
,它为我提供父表中的商品和商店详细信息,以及子表中每个商品的销售单位(作为嵌套列表)。
我知道可以使用
referrersOn
和 referencedOn
,但是在文档 StarWars 示例中,子表需要有一列指示它所连接的parent_id 行。这在我的情况下不起作用,因为我的子表可以关联到多个parent_id。
如何更新以下代码,以便父实体类使用
item
列作为两个表之间的链接,返回已售单位的嵌套列表?
parent_id | 店铺名称 | 地区 | 项目 |
---|---|---|---|
1 | 商店1 | 德克萨斯州 | 项目A |
2 | 商店2 | 内华达州 | 项目B |
3 | 商店3 | 佛罗里达 | 项目A |
4 | 商店4 | 内华达州 | 项目B |
5 | 商店5 | 亚利桑那州 | 项目A |
// Table A definition
object TableA : IntIdTable() {
val storeName = varchar("store_name", 50).uniqueIndex()
val region = varchar("region", 50)
val item = varchar("item", 50)
}
// Entity class for Table A
class TableAEntity(id: EntityID<Int>) : IntEntity(id) {
companion object : IntEntityClass<TableAEntity>(TableA)
var storeName by TableA.storeName
var region by TableA.region
var item by TableA.item
}
child_id | 项目 | 日期 | 已售出单位 |
---|---|---|---|
1 | 项目A | 2023-05-20 | 10 |
2 | 项目A | 2023-05-21 | 15 |
3 | 项目A | 2023-05-22 | 8 |
4 | 项目B | 2023-05-20 | 5 |
5 | 项目B | 2023-05-21 | 12 |
6 | 项目B | 2023-05-22 | 6 |
// Table B definition
object TableB : IntIdTable() {
val item = reference("item", TableA)
val date = date("date")
val unitsSold = integer("units_sold")
}
// Entity class for Table B
class TableBEntity(id: EntityID<Int>) : IntEntity(id) {
companion object : IntEntityClass<TableBEntity>(TableB)
var item by TableB.item
var date by TableB.date
var unitsSold by TableB.unitsSold
}
听起来您需要多对多参考。
创建一个中间表用于存储引用:
object TableATableB : Table() {
val tableA = reference("tableA", TableA)
val tableB = reference("tableB", TableB)
override val primaryKey = PrimaryKey(tableA, tableB)
}
添加对表A的引用
// Table A definition
// Entity class for Table A
class TableAEntity(id: EntityID<Int>) : IntEntity(id) {
companion object : IntEntityClass<TableAEntity>(TableA)
var storeName by TableA.storeName
var region by TableA.region
var item by TableA.item
var tableB by TableAEntity via TableATableB
}
请参阅 https://github.com/JetBrains/Exposed/wiki/DAO#many-to-many-reference