【问题标题】:How to map Many to Many projection having Seq in case class如何在案例类中映射具有 Seq 的多对多投影
【发布时间】:2023-04-08 14:00:01
【问题描述】:

我正在使用带有 Play 框架和 Scala 的 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

}

当我运行程序时,Play 给了我错误

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

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

所需级别:slick.lifted.FlatShapeLevel

这是预期的,但如何解决?

我也检查了这个例子

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

但它适用于 slick 2 并且 Intellij 找不到符号 ~

所以这行不通

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

【问题讨论】:

    标签: scala playframework-2.0 slick-3.0


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回答 +1 例如,这很有帮助,但我是否需要两个单独的类,一个用于 DAO,另一个用于 POJO,这就是示例正在做的事情吗?
    • 我想是的。 Slick 不是 ORM 而是 FRM。 stackoverflow.com/questions/39314015/… BTW 你可以用 SlickGenerator 制作 DAO 和表(如 FoodItemTable),所以你需要创建 POJO 和存储库类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多