如何在Slick中对两个不同的实体进行联合查询?
我想做一个查询,将两个不同实体的列表合并到一个列表中 我的计划是使用选项:如何在Slick中对两个不同的实体进行联合查询?,slick,slick-3.0,Slick,Slick 3.0,我想做一个查询,将两个不同实体的列表合并到一个列表中 我的计划是使用选项: // +------+---------+---------+ // | size | Some(a) | None | // | size | None | Some(b) | // +------+---------+---------+ val queryA = TableQuery[TableA].map { a => (a.size, Rep.Some(a), Rep.None[Tab
// +------+---------+---------+
// | 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) }