gpt4 book ai didi

scala - Slick 中嵌套类的隐式 GetResult

转载 作者:行者123 更新时间:2023-12-04 21:40:16 26 4
gpt4 key购买 nike

从我读过的内容来看,有一种方法可以使用嵌套类来解决具有 22 个以上字段的表的问题。它看起来像这样(有一个简单的表格):

case class UserRow(id:Int, address1:Address, address2:Address)
case class Address(street:String,city:String)

class User(tag:Tag) extends Table[UserRow](tag, "User"){
def id = column[Int]("id", O.PrimaryKey)
def street1 = column[String]("STREET1")
def city1 = column[String]("CITY1")
def street2 = column[String]("STREET2")
def city2 = column[String]("CITY2")
def * = (id, address1, address2) <> (UserRow.tupled, UserRow.unapply)
def address1 = (street1, city1) <> (Address.tupled, Address.unapply)
def address2 = (street2, city2) <> (Address.tupled, Address.unapply)
}

我意识到的是,需要隐式值的普通 SQL 不适用于此解决方案,或者至少我无法使其正常工作。

我想我可以用与嵌套类相同的方式定义隐式值,如下所示:
implicit val getAddressResult = GetResult(r => Address(r.<<, r.<<))
implicit val getUserResult = GetResult(r => UserRow(r.<<, r.<<, r.<<))

但它不起作用。它编译但运行时,它说找不到用户表。

我对 Scala 和 Slick 非常陌生,所以我可能误解了一些信息或有一些错误的概念。我究竟做错了什么?

更新

这就是我在测试中所做的:
user.ddl.create
user += UserRow(0, Address("s11", "c11"), Address("s12", "c12"))
user += UserRow(1, Address("s21", "c21"), Address("s22", "c22"))
user += UserRow(2, Address("s31", "c31"), Address("s32", "c32"))
println(user.list)
val sqlPlain = sql"SELECT * FROM user".as[UserRow]
println(sqlPlain)
println(sqlPlain.list)

所有这些都有效,直到最后一句我收到错误“找不到表“用户””。完全相同的测试也适用于非嵌套案例类。

更新 2

cvogt 已正确地向我指出,我误解了报告的错误,它与隐式 GetResult 值无关。他的回答和我的第一种方法一样是正确的。

最佳答案

将 PositionedResult r 传递给相应的 GetResult 对象:

implicit val getAddressResult = GetResult(r => Address(r.<<, r.<<))
implicit val getUserResult =
GetResult(r => UserRow(r.<<, getAddressResult(r), getAddressResult(r)))

关于scala - Slick 中嵌套类的隐式 GetResult,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28451298/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com