【发布时间】:2016-08-31 09:13:01
【问题描述】:
由于trying to make a Slick query more readable,我有这个查询构造函数,它可以工作
val q = Users.filter(_.id === userId) join People on {
case (u, p) => u.personId === p.id
} joinLeft Addresses on {
case ((u, p), a) => p.addressId === a.id
} joinLeft Businesses on {
case (((u, p), a), b) => p.businessId === b.id
} joinLeft Addresses on {
case ((((u, p), a), b), ba) => b.flatMap(_.addressId) === ba.id
} map {
case ((((u, p), a), b), ba) => (p, a, b, ba)
}
我认为这个是等效的,但不起作用:
val q = Users.filter(_.id === userId) join People joinLeft Addresses joinLeft Businesses joinLeft Addresses on {
case ((((u, p), a), b), ba) =>
u.personId === p.id &&
p.addressId === a.flatMap(_.id) &&
p.businessId === b.flatMap(_.id) &&
b.flatMap(_.addressId) === ba.id
} map {
case ((((u, p), a), b), ba) => (p, a, b, ba)
}
第二个似乎正在返回一个配置文件列表,其中包含比目标更多的配置文件。
为什么它们不一样?
“等价的”SQL(即这个构造的目标)是:
select p.*, a1.*, b.*, a2.* from Users u
innerJoin People p on (u.personId == p.id)
leftJoin Addresses a1 on (p.addressId == a1.id)
leftJoin Businesses b on (p.businessId == b.id)
leftJoin Addresses a2 on ( b.addressId == a2.id)
【问题讨论】: