如何在案例类中映射具有Seq的多对多投影

时间:2017-04-04 02:37:15

标签: scala playframework-2.0 slick-3.0

我正在使用带有Scala的Play框架的Slick 3.0。

文档说的是一对一的映射,但我没有找到任何与多对多关系相关的解决方案

http://slick.lightbend.com/doc/3.0.0/orm-to-slick.html#mapping-configuration

会有瞬态表,所以我做了一个,但问题是主要类的投影在这里是洞察力

食品项目

case class FoodItem( id: Int, name : String, 
  description : String , price :Float ,
  customization: Option[Seq[Customization] ]= None )

自定义类

case class Customization(id: Int, name : String, price : Float)

瞬态表类

case class FoodItem_Customization(customization_id : Int , food_item_id : Int )

FoodItem表

class FoodItemTable(tag: Tag) extends Table[FoodItem](tag, "FoodItem") { 
  def id = column[Int]("id", O.AutoInc, O.PrimaryKey)
  def name = column[String]("name")
  def description = column[String]("description")
  def price = column[Float]("price")



def * = (id, name,description,price) 
<> ((FoodItem.apply _).tupled, FoodItem.unapply _) //this where i have problem

}

当我运行程序时播放给我错误

  

找不到匹配的形状。 Slick不知道如何映射给定的类型。

     

可能的原因:表[T]中的T与您的*投影不匹配。或者您在查询中使用不受支持的类型(例如scala列表)。

     

所需级别:slick.lifted.FlatShapeLevel

预计会有哪些但是如何解决?

我也检查了这个例子

https://github.com/ebiznext/slick-macros/wiki/2.-Quick-User-guide#many-to-many-relationship-mapping

但它适用于光滑2和Intellij找不到符号〜

所以这不起作用

def * = id ~ name ~description ~ price  
<> ((FoodItem.apply _).tupled, FoodItem.unapply _)

1 个答案:

答案 0 :(得分:1)

它会导致错误,因为FoodItem类有customization字段而FoodItemTable类没有它;这是不匹配的。

您需要定义每个表类和映射对象。

此页面有一个很好的例子。 http://olivebh.com/scala-play-slick.html