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