2013-05-22 9 views
9

एक उपयोगकर्ता मिलान उपयोगकर्ता नाम खोजने का सही तरीका क्या है?स्लिक में केस-असंवेदनशील स्ट्रिंग तुलना?

साथ उपयोगकर्ता परिभाषित प्रकार उपयोगकर्ता

:

case class User (userId: String, username: String) 

object User extends Table[User]("user") { 
    def userId = column[String]("userId", O.PrimaryKey) 
    def username = column[String]("username") 
    def * = userId ~ authId ~ username <>(User.apply _, User.unapply _) 

    Database.forDataSource(DB.getDataSource()) withSession { 
    implicit session: Session => 

    val q = for { u <- User if u.username.equalsIgnoreCase(someUsername) } 
     yield u 
    q.headOption 

user.username प्रकार स्तंभ [स्ट्रिंग] जो स्ट्रिंग के लिए कोई रूपांतरण है की है।

वांछित क्या है डेटाबेस को स्ट्रिंग-असंवेदनशील तुलना क्वेरी के हिस्से के रूप में करना है।

उत्तर

16

मैं एक ऐसी ही स्थिति थी और toLowerCase विस्तार विधि का उपयोग कर इसे हल:

p <- u.party if p.loginName.toLowerCase === partyName.toLowerCase

आप here अधिक विस्तार के तरीकों, विशेष रूप से String ones पा सकते हैं।

+0

दिलचस्प बात यह है कि मैं स्लिम के तहत '.capitalize' विधि का उपयोग करके कुछ समान और बराबर तार करने की कोशिश कर रहा था, हालांकि यह काम नहीं करता क्योंकि यह केवल 'p.loginName'' नहीं, बल्कि मेरी 'पार्टी नाम' स्ट्रिंग को कैपिटल करता है। हालांकि .toLowerCase' हालांकि चाल चल रहा है! – dbau

+2

आपको ध्यान रखना चाहिए कि बड़ी टेबल के लिए यह बहुत अक्षम हो जाता है और कुछ मामलों में यह इंडेक्स के उचित उपयोग को रोक सकता है। मुझे एक विशेष मामला याद है जहां यह सबसे लगातार चलने वाली क्वेरी थी, पूरी बात पूरी प्रणाली पर नाटकीय प्रभाव डाल रही थी। कुछ डीबी सिस्टम फ़ंक्शन अनुप्रयोगों पर इंडेक्स के निर्माण की अनुमति दे सकते हैं (उदाहरण: लोअरकेस ('loginName')) लेकिन इस विशेष मामले में मुझे डीबी' loginName_lowercase' में एक माध्यमिक कॉलम बनाना था, जिसमें 'loginName' की लोअरकेस प्रति थी और जो क्वेरी में इस्तेमाल किया गया था। इसका प्रदर्शन पर बहुत सकारात्मक प्रभाव पड़ा। –

संबंधित मुद्दे