Slick外键映射Item表编译报错:value <> is not a member of...
问题解决思路
错误原因
你把**外键查询对象(ForeignKeyQuery)**和表的列字段Rep元组一起传给了<>操作符,而<>只支持纯列字段的Rep元组(对应数据库表的实际物理列)。ForeignKeyQuery是用来做表关联查询的对象,不是表的直接列映射,Slick无法识别这种混合类型的元组,因此抛出编译错误。
解决方案
方案1:修正表映射与样例类的对应关系(推荐)
数据库表items实际存储的是brand_id和category_id这两个外键ID,而非完整的Brand/Category对象,因此Item样例类和表映射需对应这些物理列:
- 调整Item样例类:
import java.util.UUID import scala.math.BigDecimal case class Item( id: UUID, name: String, description: Option[String], price: BigDecimal, brandId: UUID, categoryId: UUID )
- 修正ItemTable的ProvenShape定义:
class ItemTable(tag: Tag) extends Table[Item](tag, "items") { // 定义表的物理列 def id = column[UUID]("id", O.PrimaryKey) def name = column[String]("name") def description = column[Option[String]]("description") def price = column[BigDecimal]("price") def brandId = column[UUID]("brand_id") def categoryId = column[UUID]("category_id") // 定义外键关联(仅用于查询时的表关联,不参与样例类映射) def brand = foreignKey("fk_item_brand", brandId, TableQuery[BrandTable])(_.id) def category = foreignKey("fk_item_category", categoryId, TableQuery[CategoryTable])(_.id) // 仅映射物理列到样例类 override def * = (id, name, description, price, brandId, categoryId) <> (Item.tupled, Item.unapply) }
方案2:如果需要获取包含关联对象的结果(用Join查询)
若想得到包含完整Brand/Category对象的Item数据,不能在表映射里直接实现,需通过join查询组合数据:
- 定义承载关联结果的样例类:
case class ItemWithRelations( id: UUID, name: String, description: Option[String], price: BigDecimal, brand: Brand, category: Category )
- 通过join查询并映射结果:
val itemQuery = TableQuery[ItemTable] val brandQuery = TableQuery[BrandTable] val categoryQuery = TableQuery[CategoryTable] // 关联查询 val itemsWithRelations = for { item <- itemQuery brand <- brandQuery if brand.id === item.brandId category <- categoryQuery if category.id === item.categoryId } yield (item, brand, category) // 映射到关联结果样例类 val mappedItems = itemsWithRelations.map { case (item, brand, category) => ItemWithRelations(item.id, item.name, item.description, item.price, brand, category) } // 执行查询获取结果 val result: Future[Seq[ItemWithRelations]] = db.run(mappedItems.result)
内容的提问来源于stack exchange,提问作者Anderson_502
相关产品推荐
相关产品推荐

