1

假设我有一个表,其中包含与其他表相关的 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 或 Some other than the inhibitor when?

我怀疑它与返回元组有关,因为它试图返回 O1 和 O2 对象而不是 Option[O1] 和 Option[O2]

4

1 回答 1

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。通过使用,Squeryl 会为您处理抑制部分。你可以看看这个以供参考:http ://www.squeryl.org/docs/0.9.5/joins.htmlo1o2outerJoin

于 2013-06-19T16:14:36.673 回答