Slick 中嵌套 类 的隐式 GetResult
Implicit GetResult for nested classes in Slick
根据我的阅读,有一种方法可以使用嵌套的 classes 来解决 tables 超过 22 个字段的问题。它看起来像这样(用一个简单的 table):
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 - 需要隐式值 - 不适用于此解决方案,或者至少我无法使其工作。
我想我可以用与嵌套 classes 相同的方式定义隐式值,如下所示:
implicit val getAddressResult = GetResult(r => Address(r.<<, r.<<))
implicit val getUserResult = GetResult(r => UserRow(r.<<, r.<<, r.<<))
但是没有用。它编译但是当 运行 时,它说找不到用户 table。
我是 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)
所有这些都有效,直到我收到错误 "Table "USER“未找到”的最后一句话。同样,完全相同的测试也非常适合非嵌套情况 class.
更新 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)))
根据我的阅读,有一种方法可以使用嵌套的 classes 来解决 tables 超过 22 个字段的问题。它看起来像这样(用一个简单的 table):
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 - 需要隐式值 - 不适用于此解决方案,或者至少我无法使其工作。
我想我可以用与嵌套 classes 相同的方式定义隐式值,如下所示:
implicit val getAddressResult = GetResult(r => Address(r.<<, r.<<))
implicit val getUserResult = GetResult(r => UserRow(r.<<, r.<<, r.<<))
但是没有用。它编译但是当 运行 时,它说找不到用户 table。
我是 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)
所有这些都有效,直到我收到错误 "Table "USER“未找到”的最后一句话。同样,完全相同的测试也非常适合非嵌套情况 class.
更新 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)))