Scala选项类型在案例类中

我有一个案例类,其中一些字段作为选项类型。 考虑下面的案例类:

case class TypeA(field1: Int, field2: Option[String], field3: Boolean)

这个case类将由持久层实例化,该层调用数据库表并返回这个case类的一个实例。 field2的值来自数据库中的另一个表,在几乎所有情况下,返回TypeA的方法都不需要设置field2。 在通过执行数据库查找返回TypeA之后,将设置field2的值。 我想在TypeA中有field2,但我不想将它作为TypeA构造函数的一部分。 部分功能,特性出现在我的脑海中,但由于我是Scala的新手,我正在寻找一些良好的实践。 有什么建议么?


如果我很了解你的情况,你可以这样做:

case class TypeA(field1: Int, field3: Boolean) {
  lazy val field2 = YourDAO.lookup
}

请注意,在此解决方案中,字段2被延迟填充,并且始终依赖于数据库查找。


这是否完成你想要的?

case class TypeA(
  field1: Int,
  field2: Option[String] = None,
  field3: Boolean
)

val a = TypeA(field1 = 7, field3 = true)
// a: TypeA = TypeA(7,None,true)

val b = a.copy(field2 = Some("x"))
// b: TypeA = TypeA(7,Some(x),true)

实际上,如果你阅读两个表格,然后从它们中创建一些聚合实体,我建议你考虑两种方法:

1)也许你可以进行外部连接查询,这会返回给你带有Option [T]参数的实体。 在我们的项目中,我们使用Squeryl ORM。 你可以查看:http://squeryl.org/joins.html

   val query = join(typeATable, typeBTable.leftOuter)((a,b) =>
    select((a, b))
    on(a.someField === b.anotherField.?)
   )
   val result: List[(TypeA, Option[TypeB])] = query.toList

这样的查询将返回List [(TypeA,Option [TypeB])]

然后你可以将它映射到你想要的TypeC

2)另一种解决方案:创建两个DAO服务,它将从数据库中读取。 然后制作聚合器服务,将结果结合起来:

TypeA - 基本特征,将有不同的impls

trait TypeA {
  def field1: Int
  def field2: Option[String]
  def field3: Boolean
}

SimpleTypeA - 您从数据库中读取的实体。 它有field2作为无你想要^

case class SimpleTypeA(
  field1: Int,
  field3: Boolean
) extends TypeA {
  val field2: Option[String] = None
}

TypeB - 您从DB获得的其他类型:

case class TypeB(...)

然后, AggregatedTypeA - 实体将从两个数据库汇集信息:

case class AggregatedTypeA(
  entity: TypeA,
  anotherEntity: Option[TypeB]
) extends TypeA {
  def field1 = entity.field1 
  //retrive info from anotherEntity: Option[TypeB]
  def field2 = anotherEntity.map(_.someFieldOrMethod)
  def field3 = entity.field3 
}

然后执行服务:

从数据库中选择SimpleTypeA

trait TypeADAOService {
   def select(...): List[TypeA] //List[SimpleTypeA]
}

在数据库中查找TypeB

trait TypeBDAOService {
   def lookup(...): Option[TypeB]
}

集合SimpleTypeA和TypeB

trait AggregatedTypeAService {
   def select(...): List[TypeA] //List[AggregatedTypeA]
}

示例impl(使用Google Guice)

class AggregatedTypeAServiceImpl @Inject()(
  typeADAOService: TypeADAOService, 
  typeBDAOService: TypeBDAOService
) extends AggregatedTypeAService {
   def select(...) = typeADAOService.select(...).map(simpleA => 
     AggregatedTypeA(simpleA, typeBDAOService.lookup(...)))
}
链接地址: http://www.djcxy.com/p/68271.html

上一篇: Scala Option types in a case class

下一篇: Creating and merging Lists to a case class