2013-06-19 27 views
1

加入比方說,我有一個包含涉及其他表ID的表。我想獲得所有的對象,因爲這些表的組合構成了一個對象。當然我會加入他們,但我有一個問題,當一些領域是可選的。所以我想用這個「全部」。Squeryl與空列

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對象,而不是選項[01]和選項[O2]

回答

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))) 

該查詢應該適合您。在上面的,它應該只是返回Noneo1o2時不存在的字段。通過使用outerJoin,Squeryl會爲您處理抑制部分。您可以在此看一看以供參考:http://squeryl.org/joins.html

+0

這是偉大的,沒有意識到聯接語法有這個能力。你知道我將如何實現我的orderBy函數嗎? 'orderBy(main.category,main.name)'''''''''''''''''''''''''''''''''' – kingdamian42

+0

'orderBy'應該在這種情況下工作。我以前肯定使用過它,但我不記得是否在返回Tuple時嘗試過它。我知道它不完全相同,但如果這不起作用,你總是可以在返回的列表中使用'sortWith'。 – jcern

+0

我用sortWith但有人告訴我,這是一個相當不好的做法,這樣做的,因爲它沒有采取DBS索引的優勢。看起來,當我使用orderBy後,選擇它不起作用,因爲on還沒有被應用。但之後無效。 – kingdamian42