2011-06-03 16 views
5

मैं एक वर्ग User है:मैं एनोम का उपयोग कर कक्षा में पंक्ति को कैसे मैप कर सकता हूं?

case class User (id: Int, name: String) 

और मैं एक प्रश्न Anorm Stream API का उपयोग करने से पंक्तियों मैप करने के लिए करना चाहते हैं। मैं इस कोड के साथ की कोशिश की है:

val selectUsers = SQL("SELECT id, name FROM users") 
val users = selectUsers().map(
    user => User(0, user.name) 
).toList 

लेकिन मैं कोई त्रुटि मिलती है:

Error raised is : value name is not a member of play.db.anorm.SqlRow 

पर

user => User(0, user.↓name) 

मैं एक वर्ग के लिए SqlRow कैसे मैप कर सकते हैं?


रिकार्डो ने सुझाव दिया है, मैं करने की कोशिश की:

val users: List[User] = SQL("SELECT * FROM users").as(User*) 

कोई सुझाव:

object User extends Magic[User] 

val users: List[User] = SQL("SELECT * FROM users").as(User*) 

लेकिन इस कोड के साथ मैं पर एक RuntimeException occured : ColumnNotFound(User.id) मिल सकता है? क्या मुझे पहले से लाइन में User ऑब्जेक्ट रखने के लिए supposted है? और मेरे पास अभी भी मेरा case class User है।

उत्तर

3

मैं इसके साथ काम मिल गया इस:

val selectUsers = SQL("SELECT id, name FROM users") 
val users = selectUsers().map(
    user => new User(user[Int]("id"), user[String]("name")) 
).toList 

प्रत्येक पंक्ति user एक शब्दकोश है। मैं स्कैला वाक्यविन्यास बहुत अच्छी तरह से नहीं जानता।

4

आप जादू सहायक का उपयोग कर सकते हैं, एक उद्देश्य यह है कि फैली बनाने जादू:

object User extends Magic[User] 

तब:

val users:List[User] = SQL("select * from User").as(User*) 

अधिक जानकारी के लिए दस्तावेज़ देखें: Magic helper

+0

यह मेरे लिए काम नहीं करता है, मेरे अद्यतन देखें:

import {classname} val parsedValueOfUser = { get[Int]("id") ~ get[String]("name") map { case id ~ name => User(id, name) } } 

अब जब आप डेटाबेस से उपयोगकर्ता के लिए और अपने प्रयोक्ता वर्ग से मैप आप कर सकते हैं करना चाहते हैं। – Jonas

+1

कारण है कि यह मेरे लिए काम नहीं करते कि मैं डेटाबेस के रूप में PostgreSQL का उपयोग कर रहा है, और यह 'Magic' PostgreSQL के साथ उपयोग करने के लिए संभव नहीं है। – Jonas

0

मैं इस सटीक मुद्दे में भाग गया और मुझे बाहर उंगली क्या गलत था करने के लिए कुछ समय ले लिया। यह मॉडल और डेटाबेस नामों के समान हो गया, केस-संवेदी होना चाहिए। मदद करता है कि RENAME TABLE users TO User ;

आशा:

तो अपने उदाहरण के लिए अपने डेटाबेस तालिका के नाम से जाना "उपयोगकर्ता"

आप एक डेटाबेस तालिका नाम का उपयोग बदल सकते हैं की आवश्यकता होगी।

1

उसे कुछ अतिरिक्त स्केलेबल आप ऐसा कर सकता है बनाने के लिए।

एक val बनाएँ और एक उपयोगकर्ता के लिए आने वाले डेटा मैप करें।

val selectUsers = SQL("SELECT id, name FROM users").as(parsedValueOfUser *) 
संबंधित मुद्दे