【问题标题】:Case-Insensitive String Comparison in Slick?Slick中不区分大小写的字符串比较?
【发布时间】:2013-05-22 19:46:02
【问题描述】:

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

使用用户自定义类型用户:

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 是 Column[String] 类型,没有转换为 String。

希望数据库在查询中进行字符串不敏感比较。

【问题讨论】:

    标签: scala orm slick


    【解决方案1】:

    我也遇到过类似情况,用toLowerCase扩展方法解决了:

    p &lt;- u.party if p.loginName.toLowerCase === partyName.toLowerCase

    你可以找到here更多的扩展方法,尤其是String ones

    【讨论】:

    • 有趣的是,我试图在 Slick 下使用 .capitalize 方法做类似的事情并均衡字符串,但这不起作用,因为它只大写了我的 partyName 字符串,而不是 p.loginName一。 .toLowerCase 似乎可以解决问题!
    • 您应该注意,对于大型表,这变得非常低效,并且在某些情况下可能会妨碍正确使用索引。我记得一个特殊情况,这是最频繁的运行查询,整个事情对整个系统产生了巨大的影响。一些数据库系统可能允许在函数应用程序上创建索引(例如:LOWERCASE(loginName)),但在这种特殊情况下,我必须在 db loginName_lowercase 中创建一个辅助列,其中包含 loginName 的小写副本并在查询中使用。这对性能产生了非常积极的影响。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 2021-05-09
    • 2015-07-23
    • 2012-11-30
    • 1970-01-01
    相关资源
    最近更新 更多