使用光滑的scala将smallint转换为boolean

时间:2018-06-06 06:20:32

标签: postgresql scala slick

我想将postgres smallint表示为布尔值。我收到错误ERROR:运算符不存在:smallint = boolean,当使用asColumnOf操作时。有没有办法使用光滑将smallint强制转换为布尔值。

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数据库用smallint类型代表has_basket,我无法控制。

2 个答案:

答案 0 :(得分:1)

我不认为这是支持的,请参阅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)

不知道这是否是正确的做法,

答案 1 :(得分:0)

我认为,您应该在表格中覆盖*方法:

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]
}

来自Slick的documentation

  

每个表都需要一个包含默认投影的*方法。这个   描述返回行时返回的内容(以行的形式)   来自查询的表对象)。光滑的*投影不必   匹配数据库中的那个。您可以添加新列(例如,使用   计算值)或省略一些列。非提升型   对应于*投影作为类型参数给出   表。对于简单的非映射表,这将是一个列   类型或列类型的元组。

您不需要使用asColumnOf