Squeryl与空列连接

时间:2013-06-19 13:52:42

标签: sql scala join playframework squeryl

假设我有一个包含与其他表相关的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]

1 个答案:

答案 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 o1o2。通过使用outerJoin,Squeryl会为您处理抑制部分。您可以查看此内容以供参考:http://squeryl.org/joins.html