slick - 如何在 Slick 中对两个不同的实体进行联合查询?
问题描述
我想做一个查询,将两个不同实体的列表组合成一个列表。
我的计划是使用选项:
// +------+---------+---------+
// | size | Some(a) | None |
// | size | None | Some(b) |
// +------+---------+---------+
val queryA = TableQuery[TableA].map { a =>
(a.size, Rep.Some(a), Rep.None[TableB])
}
val queryB = TableQuery[TableB].map { b =>
(b.size, Rep.None[TableA], Rep.Some(b))
}
val union = (queryA ++ queryB)
但是,它不起作用。Rep.None
不支持多列值并且编译器未命中TypedType[TableA]
和TypedType[TableB]
.
建议?
解决方案
我通过先创建 id 列的联合然后加入表来解决它。远非最佳但有效。仍在寻找更好的解决方案。
// +------+------------+------------+
// | size | Some(a.id) | None |
// | size | None | Some(b.id) |
// +------+------------+------------+
val queryIdA = TableQuery[TableA].map { a =>
(a.size, Rep.Some(a.id), Rep.None[TableB])
}
val queryIdB = TableQuery[TableB].map { b =>
(b.size, Rep.None[TableA], Rep.Some(b.id))
}
val union = (queryIdA ++ queryIdB).sortBy { case (size, _, _) => size.desc }
.joinLeft(TableQuery[TableA]).on { case ((_, aid, _), a) => aid.nonEmpty && aid === a.id }
.joinLeft(TableQuery[TableB]).on { case (((_, _, bid), _), b) => bid.nonEmpty && bid === b.id }
.map { case (((_, _, _), a), b) => (a, b) }
推荐阅读
- javascript - Vue 2 - 重复的 Vue.js 实例
- tensorflow-lite - 从保存的模型转换为量化。tflite, 'op: CUSTOM 尚不支持量化'
- git - 由于远程副本后面的当前分支,推送到裸存储库被拒绝
- tensorflow2.0 - “FLAGS = flags.FLAGS”是什么意思
- php - 将两个数组转换为对象数组PHP(Laravel)
- css - 向右移动 p-panel-menu-icon
- android - Google PlayStore 在应用程序购买中退款仍然拥有
- c# - Mock.Arrange 它实际上做了什么?
- java - 无法运行maven项目。尝试使用“--enable-preview”运行
- mysql - MySQL 特定唯一约束仅针对特定值