Slick 2:获取simple.Table类中的列值

时间:2014-03-17 16:39:56

标签: playframework-2.0 slick

我有一个名为PRODUCT的SQL表,有2列(CODE VARCHAR和PATH VARCHAR)。 CODE中的最后4个字符用于识别产品的颜色。我正在使用像这样的光滑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类中的颜色作为分隔属性。有没有办法从类Product中的CODE列中获取String值(以及最后4个字符)?谢谢答案

2 个答案:

答案 0 :(得分:0)

最简单的答案是创建一个computed column in H2并在Slick中定义一个颜色列:

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

答案 1 :(得分:0)

Slick没有附带用于子字符串操作的函数。您可以将其定义为val substr = SimpleFunction.binary...(请参阅http://slick.typesafe.com/doc/2.0.0/userdefined.html)。然后,您可以定义def color = substr(code, code.length-4)。您可能不希望将其包含在*投影中,因为相应的表ddl可能会失败(如果您需要它)。相反,您可以使用单独的投影(称为*以外的其他投影)。