Сортировка без учета регистра в slick с использованием метода sortBy - PullRequest
0 голосов
/ 03 мая 2020
<>.sortBy(c => c.Name.asc).take(10)

эта сортировка в слике учитывает 'Z' перед 'а', есть ли какая-нибудь сортировка без учета регистра в слике?

1 Ответ

1 голос
/ 07 мая 2020

Существует два способа управления сортировкой без учета регистра:

  • первый вариант удобен, если вы можете контролировать столбцы базы данных и хотите, чтобы поведение без учета регистра везде было

  • второй вариант хорош, если вам нужно сделать это только в нескольких контролируемых местах.

1. Сортировка столбцов

Как сказал @bmateusz, сортировка контролируется с помощью сортировки столбцов. Это может быть установлено при создании или изменении столбца (или таблицы, или, возможно, базы данных). Скорее всего, это будет c для базы данных, которую вы используете.

Учитывая H2, таблица с именами "alice" и "Bob" будет по умолчанию (в H2) сортироваться как: "Bob «сначала, затем« Алиса ».

Вы можете изменить это, когда определяете столбец:

case class Message(name: String, id: Long = 0L)

final class MessageTable(tag: Tag) extends Table[Message](tag, "message") {
  def id = column[Long]("id", O.PrimaryKey, O.AutoInc)
  def name = column[String]("name", O.SqlType("VARCHAR_IGNORECASE(255)") )
  def * = (name, id).mapTo[Message]
}

Обратите внимание, что я указал тип столбца, который задает c для H2: VARCHAR_IGNORECASE.

Выполнение этого кода:

val testData = List( Message("alice"), Message("Bob") )

val program = for {
  _ <- messages.schema.create
  _ <- messages ++= testData
  results <- q.sortBy(c => c.name.asc).result
} yield results

val db = Database.forConfig("example")
try Await.result(db.run(program), 2.seconds).foreach(println)
finally db.close

... произведет порядок: "Алиса", "Боб".

База данных, которую вы используете, должна иметь страницу, описывающую ваши параметры сортировки. Примеры включают в себя:

Если вы не используете Slick для определения своих таблиц, вы, конечно, можете настроить параметры сортировки вне Slick (используя любые инструменты или команды, которые вы используете для управления схемой).

2 , Изменение регистра в вашем запросе

Хитрость для сортировки без учета регистра заключается в изменении запроса для преобразования текста в один регистр. Например:

val q = messages.sortBy(c => c.name.toLowerCase.asc)

Переключение в нижний регистр должно иметь аналогичный эффект. Приведенный выше Slick-запрос выдаст SQL по строкам:

select "name", "id" from "message" order by lcase("name"))
...