2013-05-22 13 views
9

Qual è il modo corretto per trovare l'unico nome utente corrispondente?Confronto tra stringhe senza distinzione tra maiuscole e minuscole in Slick?

Con definito dall'utente Tipo di utente:

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 è di tipo Colonna [String] che non ha alcuna conversione a stringa.

Ciò che si desidera è che il database esegua il confronto insensibile alle stringhe come parte della query.

risposta

16

ho avuto una situazione simile e risolto utilizzando il metodo toLowerCase estensione:

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

Potete trovare here altri metodi di estensione, in particolare String ones.

+0

È interessante notare che stavo cercando di fare qualcosa di simile e di equalizzare le stringhe usando il metodo '.capitalize' sotto Slick, tuttavia ciò non ha funzionato in quanto ha capitalizzato solo la mia stringa' partyName', non quella di 'p.loginName'. '.toLowerCase' sembra fare il trucco però! – dbau

+2

Si noti che per le tabelle di grandi dimensioni questo diventa molto inefficiente e in alcuni casi potrebbe impedire il corretto utilizzo degli indici. Ricordo un caso particolare in cui questa era la query di ricerca più frequente, l'intera cosa stava avendo un impatto drammatico sull'intero sistema. Alcuni sistemi DB potrebbero consentire la creazione di indici su applicazioni di funzione (ad esempio: LOWERCASE ('loginName')) ma in questo caso specifico ho dovuto creare una colonna secondaria nel db' loginName_lowercase' che conteneva una copia minuscola del 'loginName' e che è stato utilizzato nella query. Ciò ha avuto un impatto molto positivo sulle prestazioni. –

Problemi correlati