Slick中不区分大小写的字符串比较?

Bre*_*ust 10 orm scala slick

找到一个用户匹配用户名的正确方法是什么?

使用用户定义的类型User:

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
Run Code Online (Sandbox Code Playgroud)

user.username的类型为Column [String],它没有转换为String.

所需要的是让数据库作为查询的一部分进行字符串不敏感的比较.

Cri*_*riu 19

我有类似的情况,并通过使用toLowerCase扩展方法解决它:

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

您可以在这里找到更多扩展方法,尤其是String方法.

  • 您应该注意,对于大型表,这变得非常低效,在某些情况下,它可能会阻止正确使用索引.我记得一个特殊的情况,这是最频繁的运行查询,整个事情对整个系统产生了巨大的影响.某些数据库系统可能允许在函数应用程序上创建索引(例如:LOWERCASE(`loginName`))但在这种特殊情况下,我必须在db`loginName_lowercase`中创建一个辅助列,该列保存了`loginName`的小写副本.以及在查询中使用的.这对绩效产生了非常积极的影响. (3认同)