Ну, я бы не рекомендовал использовать конструкцию Map[String, Any]
, потому что при использовании Any
вы теряете безопасность типов: например, вы можете по ошибке перейти к функции Map("fromId" -> "1")
, и компиляция не поможет выявить проблему.
Полагаю, вам нужно передать какую-то структуру, представляющую вариативный фильтр. И Query.filterOpt
может помочь вам в этом случае. Вы можете посмотреть примеры использования по адресу: https://scala-slick.org/doc/3.3.2/queries.html#sorting -and-filtering
Пожалуйста, см. Пример кода ниже:
// Your domain filter structure. None values will be ignored
// So `UserFilter()` - will match all.
case class UserFilter(fromId: Option[Int] = None, fromString: Option[String] = None)
def all(perPage: Int, page: Int, filter: UserFilter): Future[ResultPagination[User]] = {
val baseQuery = for {
items <- {
query
.filterOpt(filter.fromId)(_.fromId === _)
.filterOpt(filter.fromString)(_.fromType === _)
.take(perPage)
.drop(page)
.result
}
total <- query.length.result
} yield ResultPagination[User](items, total)
db.run(baseQuery)
}
И это будет безопасно. Надеюсь, это поможет!