2015-04-22 56 views
1

鑑於以下窗口小部件表Squeryl從選擇更新?

╔════╦═════════╦═════╗ 
║ id ║ prev_id ║ foo ║ 
╠════╬═════════╬═════╣ 
║ 1 ║   ║ bar ║ 
║ 2 ║  1 ║  ║ 
╚════╩═════════╩═════╝ 

而且下面的SQL查詢

UPDATE widgets 
SET 
    widgets.foo = 
    (
    SELECT widgets.foo 
    FROM widgets 
    WHERE widgets.id = 1 
    ) 
WHERE 
    widgets.id = 2 

我怎麼做squeryl上述更新?

我試圖

update(widgets) (
    w=> 
     where(w.id === 2) 
     set(w.foo := from(widgets)(prevW => where(prevW.id === 1) select foo)) 
) 

但是,這給了我下面的編譯錯誤:

error: No implicit view available from org.squeryl.Query[Option[String]] => org.squeryl.dsl.ast.TypedExpressionNode[Option[org.squeryl.PrimitiveTypeMode.StringType]]. 
+0

我不知道隨便。我想你可以通過以下方式在Squery列表中獲得更好的運氣:https://groups.google.com/forum/#!forum/squeryl –

回答

1

它看起來像Squeryl添加子查詢的支持與https://github.com/max-l/Squeryl/commit/e75ddecf4a0855771dd569b4c4df4e23fde2133e

然而它需要一個聚集查詢這是保證返回一個結果。這是通過compute條款完成的。

我想出了一個使用compute(min(foo))的解決方法。

所以我的解決方案最終看起來像

update(widgets) (
    w=> 
    where(w.id === 2) 
    set(w.foo := from(widgets)(prevW => where(prevW.id === 1) compute(min(foo)))) 
) 

也許應該有一個single聚合函數,如果該查詢返回不止一個結果拋出異常。

相關對話: