假设我有一个包含与其他表相关的ID的表。我想得到所有对象,因为表的组合构成了一个对象。当然我会加入他们但是当一些字段是可选的时候我有一个问题。所以我想用这个“全力以赴”。
from(mainTable,
optionalFieldTable,
optionalFieldTable,
requiredFieldTable1,
requiredFieldTable2)((main,o1,o2,r1,r2) =>
where(
(main.someId1 === r1.id) and
(main.someId2 === r2.id) and
(main.optId1.inhibitWhen(main.optId1 == None) === o1.id) and
(main.optId2.inhibitWhen(main.optId2 == None) === o2.id))
select(main,o1,o2,r1,r2)
).toList
以上给我一个空列表。如果我从查询中删除可选字段,尽管它可以工作。那么我想知道是否有一种特殊的方法来测试可选的id是否为None或者除了抑制时的其他?
我怀疑它与返回元组有关,因为它试图返回O1和O2对象而不是Option [O1]和Option [O2]
答案 0 :(得分:1)
我想您可能想要使用连接语法,如:
join(mainTable,
requiredFieldTable1,
requiredFieldTable2,
optionalFieldTable1.leftOuter,
optionalFieldTable2.leftOuter)((main,r1,r2,o1,o2) =>
select(main,o1,o2,r1,r2)
on(main.someId1 === r1.id,
main.someId2 === r2.id,
main.optId1 === o1.map(_.id),
main.optId2 === o2.map(_.id)))
该查询应该适合您。在上文中,当字段不存在时,它应该只返回None
o1
和o2
。通过使用outerJoin
,Squeryl会为您处理抑制部分。您可以查看此内容以供参考:http://squeryl.org/joins.html