Примените smallint к логическому значению с гладким, scala - PullRequest
0 голосов
/ 06 июня 2018

Я бы хотел представить postgres smallint как логическое значение.Я получаю сообщение об ошибке: оператор не существует: smallint = boolean, при использовании операции asColumnOf.Есть ли способ привести smallint к логическому значению, используя slick.

case class Bike(id: Long, hasBasket: Boolean)

trait BikeTable {
class Bikes(tag: Tag) extends Table[Bike](tag, "bike") {
  def id = column[Long]("id")
  def hasBasket = column[Boolean]("has_basket")
  overide def *  = (id,hasBasket) <> ((Bike.apply _).tupled, Bike.unapply)
}

protected val bycles = TableQuery[Bikes]
}


def getBycycleFilterDetails(bycleSearch:BycleSearch): 
Future[Seq[BycleDetails]] = {
val query = for {
  bikes <- byclces

} yield (byclces.id, byclces.hasBasket)


val possiblyFilteredByHasBasket = if (bycleSearch.hasBasket.isDefined) {
  query.withFilter(u => u._2.asColumnOf[Boolean] === bycleSearch.hasBasket.get)
} else query

val result = possiblyFilteredByHasBasket.result

, если я использую

   u => u._2.asColumnOf[Boolean] == bycleSearch.hasBasket.get or  u => u._2 == bycleSearch.hasBasket.get

Я получу пустой набор результатов, если я использую

   u => u._2.asColumnOf[Boolean] === bycleSearch.hasBasket.get  or u => u._2 === bycleSearch.hasBasket.get

Я получаю ошибку postgres выше. Таблица базы данных postgres представляет has_basket типом smallint, который я не могу контролировать.

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Не думаю, что это поддерживается, см. Github.com/slick/slick/issues/1111

Обходное решение, которое я использовал

    case class Bool(value: Boolean)

и

    implicit val hasBasketColumnType: BaseColumnType[Bool] = MappedColumnType.base[Bool, Short]({ b => if (b == Bool(true)) 1 else 0}, { i => if (i == 1) Bool(true)  else Bool(false) })

и используйте этот тип везде вместо логического

     u => u._2 === Bool(bycleSearch.hasBasket.get)

Не знаю, правильный ли это способ,

0 голосов
/ 06 июня 2018

Я думаю, вам следует переопределить * метод в вашей таблице:

trait BikeTable {
class Bikes(tag: Tag) extends Table[Bike](tag, "bike") {
  def id = column[Long]("id")
  def hasBasket = column[Boolean]("has_basket")

  override def * = (id, hasBasket).mapTo[Bike]
}

Из документации Слика :

Каждая таблица требует * метода, связывающегопроекция по умолчанию.Это описывает то, что вы получаете, когда возвращаете строки (в форме табличного объекта) из запроса.* Слик проекции не должен совпадать с проекцией в базе данных.Вы можете добавить новые столбцы (например, с вычисленными значениями) или опустить некоторые столбцы, как вам нравится.Неподнятый тип, соответствующий проекции *, задается в качестве параметра типа для таблицы.Для простых не отображенных таблиц это будет один тип столбца или кортеж типов столбцов.

Вам не нужно использовать asColumnOf

...