2012-06-27 26 views
6

當試圖刪除一批記錄時,只有單行行被刪除!爲什麼這個ScalaQuery語句只能刪除奇數行?

val byUser = Orders.createFinderBy(_.userID) 
byUser(id).mutate(_.delete) 

如果我反而打印記錄,我得到正確的行數。

byUser(id).mutate{x => x.echo} 

我工作圍繞這樣的問題,產生所需的SQL。

(for{o <- Orders if o.userID is id.bind } yield o).delete 

但是,mutate版本爲什麼或者如何影響奇數行?

+5

雖然我不知道在這種情況下發生了什麼,這是一個鏈接列表很常見的問題:當您嘗試刪除在迭代時,您刪除一個,然後迭代一個,然後刪除一個,等剩下一半的列表。取決於它的創建方式,任何可變集合上的迭代器都會遇到這個問題。我不知道在這裏可以使用哪些替代策略 - 通過鏈接列表,您只需刪除並讓刪除本身遍歷整個列表即可解決問題。 –

+0

@RexKerr必須與您所描述的內容類似。另一種方法是創建一個查詢,該查詢不調用MutatingUnitInvoker(由createFinderBy等準備語句表達式生成的查詢類型,以及通過參數[T]綁定的表達式) – virtualeyes

+0

@RexKerr看起來您已經得到了唯一的答案,I會張貼它,並得到一些贊成票:) –

回答

1

我已經在源代碼周圍挖,它似乎是爲@RexKerr說 - 迭代器用於處理元素,應用的缺失,因爲它迭代(在這裏發生變異方法while循環) :

https://github.com/rjmac/scala-query/blob/master/src/main/scala/org/scalaquery/MutatingInvoker.scala

有趣的是有previousAfterDelete標誌,可用於每個刪除之後促使迭代向後。這似乎是設置爲true Access數據庫(見AccessQueryInvoker類),而不是其他人:

https://github.com/rjmac/scala-query/blob/master/src/main/scala/org/scalaquery/ql/extended/AccessDriver.scala

我建議下載的來源和調試代碼。也許這個標誌應該爲你正在使用的數據庫供應商設置。我還考慮提交Bug報告:

http://scalaquery.org/community.html

PS。我知道這是一個古老的問題,但回答它,以防萬一其他人有這個問題

+0

社區早已轉移到圖書館的下一個版本Slick,但我仍然在SQ上有一個項目,所以感謝期待已久的答案;-) – virtualeyes

相關問題