Slick 2: получение значения столбца в классе simple.Table

У меня есть таблица SQL под названием PRODUCT с двумя столбцами (CODE VARCHAR и PATH VARCHAR). Последние 4 символа в CODE используются для распознавания цвета продукта. Я использую slick 2.0 следующим образом:

import scala.slick.driver.H2Driver.simple._

case class Product(code: String, path: String, color: String)

class Products(tag: Tag) extends Table[Product](tag, "PRODUCTS") {
  def code = column[String]("CODE", O.PrimaryKey)
  def path = column[String]("PATH")
  def * = (code, path, "LAST 4 CHARS OF CODE") <> (Product.tupled, Product.unapply)
}

Моя проблема в том, что я хотел бы иметь цвет в классе case как отдельный атрибут. Есть ли способ получить значение String (и последние 4 символа) из столбца CODE в классе Products? Спасибо за ответы


person ptrlaszlo    schedule 17.03.2014    source источник


Ответы (2)


Самый простой ответ — создать вычисляемый столбец в H2 и определить столбец цвета в Слике:

class ProductTable(tag: Tag) extends Table[Product](tag, "PRODUCTS") {
  def code = column[String]("CODE", O.PrimaryKey)
  def path = column[String]("PATH")
  def color = column[String]("COLOR", O.DBType("VARCHAR AS SUBSTR(PATH, LENGTH(PATH) - 3)"))
  def * = (code, path, color) <> (Product.tupled, Product.unapply)
}
person josephpconley    schedule 17.03.2014
comment
Почему мы не можем получить значение из столбца? Например, как code.value или что-то в этом роде? - person ptrlaszlo; 18.03.2014
comment
Лапи, см. мой альтернативный ответ. - person cvogt; 18.03.2014

Slick не поставляется с функцией для операций с подстроками. Вы можете определить его как val substr = SimpleFunction.binary... (см. http://slick.typesafe.com/doc/2.0.0/userdefined.html). Затем вы можете определить def color = substr(code, code.length-4). Возможно, вы не захотите включать его в свою проекцию *, так как соответствующая таблица ddl, вероятно, не сработает (если вам это нужно). Вместо этого вы можете использовать отдельную проекцию (называемую иначе, чем *).

person cvogt    schedule 18.03.2014