我想将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,我无法控制。
答案 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