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.
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
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ść. –