2015-12-21 12 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) 

संपादित करें: कुछ उम्मीद एसक्यूएल होना चाहिए की तरह:

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

मुझे पूरी तरह से यकीन नहीं है कि परिणामस्वरूप आप क्या उम्मीद करते हैं। मुझे लगता है मुझे पूछना है: आप इसे सादे एसक्यूएल में कैसे करेंगे? –

+0

@ Patrykwwiek उदाहरण के साथ अद्यतन एसक्यूएल – 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 रों पारित), लेकिन आप के आसपास क्वेरी "खंड" गुजर पर जोर देते हैं, कुछ इस तरह काम कर सकता था:

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

हां, मैं एक प्रश्न में खंड जोड़ सकता हूं, लक्ष्य बनाया गया था जो विभिन्न प्रश्नों को लेना था और उदाहरण के लिए एसक्यूएल उत्पन्न करने के लिए उन्हें एक साथ लाया गया था। – IUnknown

+0

@I अज्ञात मेरा संपादन देखें। – 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 
संबंधित मुद्दे