2015-12-21 61 views
5

使用Slick 3.1,如何將多個查詢合併到同一類型的單個查詢中?這是不是聯接或聯合,但組合查詢「段」來創建單個查詢請求。這些「細分」可以是任何單獨有效的查詢。將光滑查詢合併到單個查詢中

val query = TableQuery[SomeThingValid] 

// build up pieces of the query in various parts of the application logic 
val q1 = query.filter(_.value > 10) 
val q2 = query.filter(_.value < 40) 
val q3 = query.sortBy(_.date.desc) 
val q4 = query.take(5) 

// how to combine these into a single query ? 
val finalQ = ??? q1 q2 q3 q4 ??? 

// in order to run in a single request 
val result = DB.connection.run(finalQ.result) 

編輯: 預期的SQL應該是這樣的:

SELECT * FROM "SomeThingValid" WHERE "SomeThingValid"."value" > 10 AND "SomeThingValid"."valid" < 40 ORDER BY "MemberFeedItem"."date" DESC LIMIT 5 
+1

我不完全確定你期望的結果。我想我必須問:你如何在普通的SQL中做到這一點? –

+0

@PatrykĆwiek更新與預期的例子sql – IUnknown

回答

4
val q1 = query.filter(_.value > 10) 
val q2 = q1.filter(_.value < 40) 
val q3 = q2.sortBy(_.date.desc) 
val q4 = q3.take(5) 

我認爲你應該做類似上面的(和繞過Query S),但是如果你堅持在繞過查詢「段」,這樣的事情可能工作:

type QuerySegment = Query[SomeThingValid, SomeThingValid, Seq] => Query[SomeThingValid, SomeThingValid, Seq] 

val q1: QuerySegment = _.filter(_.value > 10) 
val q2: QuerySegment = _.filter(_.value < 40) 
val q3: QuerySegment = _.sortBy(_.date.desc) 
val q4: QuerySegment = _.take(5) 

val finalQ = Function.chain(Seq(q1, q2, q3, q4))(query) 
+0

是的,我可以將子句添加到查詢中,目標是採取已創建的各種查詢並將它們組合在一起生成sql,如示例中所示。 – IUnknown

+0

@IUnknown查看我的編輯。 – danielnixon

+0

很好,謝謝 - 這正是我所尋找的 – IUnknown

0

我用這個 「模式」 與slick2.0

val query = TableQuery[SomeThingValid] 

val flag1, flag3 = false 
val flag2, flag4 = true 

val bottomFilteredQuery = if(flag1) query.filter(_.value > 10) else query 
val topFilteredQuery = if(flag2) bottomFilteredQuery.filter(_.value < 40) else bottomFilteredQuery 
val sortedQuery = if(flag3) topFilteredQuery.soryBy(_.date.desc) else topFilteredQuery 
val finalQ = if(flag4) sortedQuery.take(5) else sortedQuery 
+0

這不會在我的情況下工作,因爲傳入的查詢是一個非確定性的任意設置。 – IUnknown

-1

我認爲,它應該工作。但我還沒有測試過。

val users = TableQuery[Users] 
val filter1: Query[Users, User, Seq] = users.filter(condition1) 
val filter2: Query[Users, User, Seq] = users.filter(condition2) 
(filter1 ++ filter2).result.headOption 
相關問題