के लिए एसक्यूएल डीएसएल मैं स्कैला के लिए एसक्यूएल डीएसएल बनाने के लिए संघर्ष कर रहा हूं। डीएसएल Querydsl का विस्तार है, जो जावा के लिए एक लोकप्रिय क्वेरी एब्स्ट्रक्शन लेयर है।स्कैला
मैं निम्नलिखित
user.firstName == "Bob" || user.firstName == "Ann"
की तरह वास्तव में सरल भाव के साथ अब संघर्ष कर रहा हूँ Querydsl पहले से ही एक अभिव्यक्ति मॉडल है जो यहां इस्तेमाल किया जा सकता मैं रूपांतरण प्रदान करने की प्रॉक्सी भाव Querydsl को वस्तुओं से निर्णय लिया का समर्थन करता है के रूप में। आदेश प्रोक्सी का उपयोग करने के लिए मैं इस
import com.mysema.query.alias.Alias._
var user = alias(classOf[User])
निम्नलिखित निहित रूपांतरण मैं Querydsl में प्रॉक्सी उदाहरणों और प्रॉक्सी संपत्ति कॉल जंजीरों में बदल सकते हैं के साथ
की तरह एक उदाहरण भाव
import com.mysema.query.alias.Alias._
import com.mysema.query.types.expr._
import com.mysema.query.types.path._
object Conversions {
def not(b: EBoolean): EBoolean = b.not()
implicit def booleanPath(b: Boolean): PBoolean = $(b);
implicit def stringPath(s: String): PString = $(s);
implicit def datePath(d: java.sql.Date): PDate[java.sql.Date] = $(d);
implicit def dateTimePath(d: java.util.Date): PDateTime[java.util.Date] = $(d);
implicit def timePath(t: java.sql.Time): PTime[java.sql.Time] = $(t);
implicit def comparablePath(c: Comparable[_]): PComparable[_] = $(c);
implicit def simplePath(s: Object): PSimple[_] = $(s);
}
अब मैं जैसे भाव का निर्माण कर सकते बनाने यह
import com.mysema.query.alias.Alias._
import com.mysema.query.scala.Conversions._
var user = alias(classOf[User])
var predicate = (user.firstName like "Bob") or (user.firstName like "Ann")
मैं निम्नलिखित समस्या से जूझ रहा हूं।
eq
और ne
स्काला में तरीकों के रूप में पहले से ही उपलब्ध हैं, इसलिए रूपांतरण शुरू हो रहा नहीं कर रहे हैं, जब वे उपयोग किया जाता है
यह समस्या निम्नलिखित के रूप में सामान्यीकृत किया जा सकता। टाइप नामों का उपयोग करते समय जो पहले से ही स्केल प्रकारों जैसे ईक, ने, स्टार्ट के साथ उपलब्ध हैं, इत्यादि को किसी भी प्रकार के भागने के लिए अंतर्निहित रूपांतरणों को ट्रिगर करने की आवश्यकता होती है।
मैं निम्नलिखित
अपरकेस
var predicate = (user.firstName LIKE "Bob") OR (user.firstName LIKE "Ann")
यह उदाहरण के लिए Circumflex ORM में दृष्टिकोण, स्काला के लिए एक बहुत शक्तिशाली ORM ढांचे समान डीएसएल के साथ करना है पर विचार कर रहा हूँ। लेकिन यह दृष्टिकोण प्रश्न कीवर्ड (चयन, से, जहां आदि) के साथ असंगत होगा, जो Querydsl में लोअरकेस हैं।
कुछ उपसर्ग
var predicate = (user.firstName :like "Bob") :or (user.firstName :like "Ann")
विधेय उपयोग के संदर्भ इस
var user = alias(classOf[User])
query().from(user)
.where(
(user.firstName like "Bob") or (user.firstName like "Ann"))
.orderBy(user.firstName asc)
.list(user);
की तरह कुछ आपको बेहतर विकल्प या स्काला के लिए एसक्यूएल डीएसएल निर्माण के लिए एक अलग दृष्टिकोण दिखाई दे रही है है?
तो सवाल यह मूल रूप से दो मामलों
जब एक विधि है कि सुपर वर्ग में मौजूद है (उदाहरण के लिए
eq
)यह तो का उपयोग कर एक अंतर्निहित रूपांतरण गति प्रदान करने के क्या यह संभव है करने के लिए नीचे फोड़े संभव नहीं है,
eq
,ne
जैसी विधियों के लिए उपयोग करने के लिए सबसे अधिक स्केलेस्क सिंटैक्स क्या होगा।
संपादित
हम Querydsl में स्काला का समर्थन मिला उर्फ उदाहरणों और एक $ -prefix आधारित भागने सिंटेक्स के उपयोग से काम कर रहे। परिणाम पर एक ब्लॉग पोस्ट यहां दिया गया है: http://blog.mysema.com/2010/09/querying-with-scala.html
तो प्रश्न मूल रूप से दो मामलों तक उबाल जाता है ए) क्या सुपर क्लास (उदाहरण के लिए 'eq') में मौजूद विधि का उपयोग करते समय एक अंतर्निहित प्रकार रूपांतरण को ट्रिगर करना संभव है और बी) यदि यह संभव नहीं है, तो क्या होगा 'eq',' ne' जैसी विधियों के लिए उपयोग करने के लिए सबसे अधिक स्केलेस्क सिंटैक्स बनें। क्या मैं सही ढंग से समझ गया? – ponzao
@ponzao आप मेरे दिमाग को पढ़ रहे हैं! मैंने अपने प्रश्न को "उबला हुआ" एक के साथ समाप्त करने की स्वतंत्रता ली। –
यदि आप इसे स्वयं के लिए नहीं बना रहे हैं, तो ScalaQuery, Scala के लिए एक प्रकार-सुरक्षित डेटाबेस क्वेरी API देखें: http://github.com/szeiger/scala-query –