2013-05-22 19 views
9

Jaki jest właściwy sposób na znalezienie jednej pasującej nazwy użytkownika?Porównanie niewrażliwych na wielkości liter w Slick?

z typ zdefiniowany przez użytkownika Użytkownik:

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 jest typu kolumny [String], który ma konwersję na łańcuch.

Wymagane jest, aby baza danych przeprowadziła porównywanie bez uwzględniania łańcuchów jako części zapytania.

Odpowiedz

16

miałem podobną sytuację i rozwiązać go za pomocą metody toLowerCase rozszerzenia:

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

można znaleźć here więcej metod przedłużających, zwłaszcza String ones.

+0

Co ciekawe, próbowałem zrobić coś podobnego i wyrównać ciągi znaków za pomocą metody '.capitalize' w Slick, ale to nie zadziałało, ponieważ skapitalizowało tylko mój ciąg' partyName', a nie 'p.loginName'. '.toLowerCase' wydaje się jednak działać! – dbau

+2

Należy zauważyć, że w przypadku dużych tabel staje się to bardzo nieefektywne, aw niektórych przypadkach może uniemożliwić prawidłowe korzystanie z indeksów. Pamiętam jeden konkretny przypadek, w którym to było najczęstsze zapytanie, całe przedsięwzięcie miało dramatyczny wpływ na cały system. Niektóre systemy DB mogą pozwalać na tworzenie indeksów na aplikacjach funkcyjnych (np .: LOWERCASE ('loginName')), ale w tym konkretnym przypadku musiałem utworzyć dodatkową kolumnę w db' loginName_lowercase' która zawierała małą kopię 'loginName' i który został użyty w zapytaniu. Miało to bardzo pozytywny wpływ na wydajność. –

Powiązane problemy