2013-07-18 11 views
8

आईडी द्वारा एक ही पंक्ति का चयन करना एक आसान काम होना चाहिए, फिर भी मुझे यह समझने में थोड़ा परेशानी हो रही है कि यह मेरी वस्तु को कैसे मैप करें।आईडी

मुझे this question मिला जो एक ही चीज़ की तलाश में है लेकिन उत्तर दिया गया मेरे लिए काम नहीं करता है।

वर्तमान में मेरे पास यह काम कर रहा है, लेकिन यह उतना ही सुरुचिपूर्ण प्रतीत नहीं होता जितना होना चाहिए।

def getSingle(id: Long):Option[Category] = withSession{implicit session => 
(for{cat <- Category if cat.id === id} yield cat).list.headOption 
//remove the .list.headOption and the function will return a WrappingQuery 
} 

मैं तो headOption लेने सूची प्राप्त करने लगता है सिर्फ भारी और अनावश्यक है। मेरा कुछ छूट रहा है।

यदि यह मदद करता है, यहाँ मेरी श्रेणी कोड

case class Category(
    id: Long = 0L, 
    name: String 
) 
object Category extends Table[Category]("categories"){ 

    def name = column[String]("name", O.NotNull) 
    def id = column[Long]("id", O.PrimaryKey, O.AutoInc) 

    def * = id ~ name <> (Category.apply _, Category.unapply _) 

    ... 
} 

अधिक है वहाँ एक आसान तरीका सिर्फ एक विकल्प [टी] एक आईडी स्लिक का उपयोग करने से प्राप्त करने के लिए है?

समाधान ड्राइवर चालक था। मैं .firstOption का उपयोग नहीं कर सका लेकिन mysql jdbc 5.1.25 में अपग्रेड किया गया और सब ठीक है!

Category.filter{ _.id === id }.list.headOption 

यह अधिक स्वच्छ दिखता है:

उत्तर

9

आप ऐसा कर सकते हैं

val byId = t.createFinderBy(t => t.id)

इससे पहले से तैयार तैयार किया जाएगा बयान है कि आप अपने विधि से उपयोग कर सकते हैं

def getSingle(id: Long):Option[Category] = byId(id).firstOption

+0

के पास SQL ​​वाक्यविन्यास में एक एसक्यूएल त्रुटि 'त्रुटि मिलती है यदि मैं आपके द्वारा पोस्ट किए गए पहले समाधान का उपयोग करता हूं तो मुझे OPTION SQL_SELECT_LIMIT के पास' SQL वाक्यविन्यास में त्रुटि 'मिलती है = DEFAULT'' – kingdamian42

+3

ड्राइवर समस्या हो सकती है। Http://stackoverflow.com/questions/15113707/error-code-1064-sql-state-42000-you-have-an-error-in-your-sql-syntax – Nilanjan

+2

पर एक नज़र डालें "mysql" % "mysql-connector-java"% "5.1.25" '। महान काम करता है, धन्यवाद! – kingdamian42

3

सबसे पहले, आपको कोशिश कर सकते हैं एक ही कोड के desugared संस्करण का उपयोग करने के लिए है।

इसके अलावा, आप firstOption विधि का उपयोग कर सकते हैं:

def getSingle(id: Long):Option[Category] = withSession{implicit session => 
Query(Category).where(_.id === id).firstOption 
} 

आप अक्सर इस क्वेरी का उपयोग करते हैं तो आप QueryTemplate पर विचार करना चाहिए:

Category.filter{ _.id === id }.firstOption 
+0

या यहां तक ​​कि 'पहले' अगर आपको यकीन है कि आपकी क्वेरी किसी ऑब्जेक्ट को वापस कर रही है। और यह 'प्रश्न (श्रेणी) नहीं है ... '? –

+0

@alno मैं वास्तव में पहले ही फ़िल्टर संस्करण पर स्विच कर चुका था और अभी यहां अपना कोड अपडेट नहीं किया था। लेकिन 'category.filter (_। Id === id) का उपयोग कर। फर्स्टऑप्शन 'मुझे' टाइप मिस्चैच 'देता है; मिला: विकल्प [scala.slick.lifted.NothingContainer # TableNothing] आवश्यक: विकल्प [मॉडल। श्रेणी] 'यही कारण है कि मैंने सूची में स्विच किया। शीर्ष स्थान पर विकल्प। – kingdamian42

+0

बस परीक्षण किया गया - मुझे विकल्प (scala.slick.lifted.NothingContainer # TableNothing] दोनों प्रकारों में, क्वेरी (श्रेणी) में रैपिंग तालिका में सहायता मिलती है। – alno

0

मैं प्ले 2.2.1 के साथ चालाक 1.0.1 का उपयोग कर रहा है और मेरे लिए निम्नलिखित काम करता है।

val byId = createFinderBy(_.id) 

फिर इसे किसी विधि से कॉल करें।

def findById(id: Int): Option[Category] = DB.withSession { implicit session => 
    Category.byId(id).firstOption 
    } 

कृपया ध्यान दें, डीबी.with सत्र प्ले फ्रेमवर्क से एक तरीका है।

यदि आप Play का उपयोग नहीं कर रहे हैं, तो विधि नीचे की तरह कुछ होगी।

def findById(id: Int)(implicit session: Session): Option[Category] = { 
    Category.byId(id).firstOption 
    }