相关疑难解决方法(0)

斯卡拉光滑的方法到目前为止我无法理解

我尝试了解一些Slick的作品以及它需要什么.

这是一个例子:

package models

case class Bar(id: Option[Int] = None, name: String)

object Bars extends Table[Bar]("bar") {
  def id = column[Int]("id", O.PrimaryKey, O.AutoInc)

  // This is the primary key column
  def name = column[String]("name")

  // Every table needs a * projection with the same type as the table's type parameter
  def * = id.? ~ name <>(Bar, Bar.unapply _)
}
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下*这里方法的目的是什么<>,为什么unapply?什么是Projection - 方法~'返回实例Projection2

scala magic-methods scalaquery playframework-2.0 slick

88
推荐指数
2
解决办法
2万
查看次数

使用<>映射投影到Slick中具有伴随对象的案例类

使用Slick,我试图将数据库表条目直接投影到它们所代表的案例类.按照文档中示例,我使用<>运算符设置了映射投影:

case class SomeEntity3(id: Int, entity1: Int, entity2: Int)

val SomeEntityTable = new Table[SomeEntity3]("some_entity_table") {
  def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
  def entity1 = column[Int]("entity1")
  def entity2 = column[Int]("entity2")

  def * = id ~ entity1 ~ entity2 <> (SomeEntity3, SomeEntity3.unapply _)
}
Run Code Online (Sandbox Code Playgroud)

现在,我想为SomeEntity3添加一些静态常量和辅助方法.为此,我创建了一个伴侣对象.但是只要我加入这条线

object SomeEntity3
Run Code Online (Sandbox Code Playgroud)

一个非常疯狂的多行错误弹出,用于定义*说"使用替代方法重载方法值<>"时难以辨认的内容.

伴侣对象如何与Slick中的双向映射相关,我能以某种方式实现我的目标吗?

scala slick

5
推荐指数
2
解决办法
5068
查看次数

光滑的codegen和表> 22列

我是Slick的新手.我正在使用Scala,ScalaTest和Slick为Java应用程序创建测试套件.我在测试之前使用slick来准备数据,并在测试之后对数据进行断言.使用的数据库有一些超过22列的表.我使用slick-codegen生成我的架构代码.

对于列数超过22的表,slick-codegen不会生成案例类,而是基于HList的自定义类型和伴随"构造函数"方法.据我了解,这是因为元组和案例类只能有22个字段的限制.生成代码的方式,Row对象的字段只能通过索引访问.

我有几个问题:

  1. 根据我的理解,案例类的22个字段限制已在Scala 2.11中修复,对吧?
  2. 如果是这种情况,是否可以自定义slick-codegen来为所有表生成案例类?我调查了这个:我设法进行override def hlistEnabled = false了覆盖SourceCodeGenerator.但这导致了Cannot generate tuple for > 22 columns, please set hlistEnable=true or override compound.所以我没有能够解除HList的意义.可能是'或覆盖复合'部分,但我不明白这意味着什么.
  3. 在光滑的22列上搜索互联网,我发现了一些基于嵌套元组的解决方案.是否可以自定义codegen以使用此方法?
  4. 如果生成包含> 22字段的案例类的代码不是一个可行的选项,我认为可以生成一个普通的类,它为每列提供了"访问器"功能,从而提供了基于索引的访问的"映射"基于名称的访问.我很乐意为自己实现这一代,但我想我需要一些指针从哪里开始.我认为它应该能够覆盖标准的codegen.我已经使用重写SourceCodeGenerator了一些自定义数据类型.但是,除了这种使用情况下,代码生成的文档并不能帮助我太多.

我真的很感激这里的一些帮助.提前致谢!

scala slick slick-codegen

5
推荐指数
2
解决办法
2207
查看次数

光滑:使用Column [Int]值的困难

我有一个跟随我最近问的另一个Slick问题(Slick table Query:Trouble with recognition value).请多多包涵!!我是数据库的新手,Slick在文档方面似乎特别差.无论如何,我有这张桌子:

object Users extends Table[(Int, String)]("Users") {

  def userId          = column[Int]("UserId", O.PrimaryKey, O.AutoInc)
  def userName        = column[String]("UserName")

  def * = userId ~ userName
}
Run Code Online (Sandbox Code Playgroud)

第一部分

我正在尝试使用此函数进行查询:

def findByQuery(where: List[(String, String)]) = SlickInit.dbSlave withSession {    

  val q = for {
    x <- Users if foo((x.userId, x.userName), where)
           } yield x
      q.firstOption.map { case(userId, userName) =>
                    User(userId, userName)}
   }
Run Code Online (Sandbox Code Playgroud)

其中"where"是搜索查询列表// ex.("userId","1"),("userName","Alex")"foo"是测试相等性的辅助函数.我遇到了类型错误.
x.userId的类型为Column [Int].如何将其作为Int来操纵?我试过铸造,例如:

foo(x.userId.asInstanceOf[Int]...)
Run Code Online (Sandbox Code Playgroud)

但我也遇到了麻烦.如何处理Slick返回类型?

第二部分 是否有人熟悉铸造功能:

def*= userId~userName <>(User,User.unapply _)

?我知道这个问题有一些很好的答案,最值得一提的是:到目前为止我无法理解的scala光滑方法和一个非常相似的问题:在SLICK中用伴随对象映射投影 …

database scala scalatra slick

1
推荐指数
1
解决办法
3762
查看次数