如何在无形中创建生成的对象

How to create generated objects in shapeless

假设我有一个通用类型的规范化数据库模型,如下所示:

case class BaseModel(id: String, 
                     createdBy: String,
                     attr1: Option[String] = None,
                     attr2: Option[Int] = None, 
                     attr3: Option[LocalDate] = None)

给定一个BaseModel的序列,如果所有某个Option属性的字段都没有填充,shapeless可以为我创建一个简化模型吗?

例如,假设所有 attr1 字段都是空的。 无需我事先指定对象 shapeless 可以创建一个看起来像这样的通用对象吗?

case class BaseModel(id: String, 
                     createdBy: String,
                     attr2: Option[Int] = None, 
                     attr3: Option[LocalDate] = None)

Shapeless 可以做的是,给定两种情况 classes,从另一个的对象创建其中一个的对象。

import java.time.LocalDate
import shapeless.LabelledGeneric
import shapeless.record._

case class BaseModel(id: String,
                     createdBy: String,
                     attr1: Option[String] = None,
                     attr2: Option[Int] = None,
                     attr3: Option[LocalDate] = None)

case class BaseModel1(id: String,
                      createdBy: String,
                      attr2: Option[Int] = None,
                      attr3: Option[LocalDate] = None)

val bm = BaseModel(
  id = "cff4545gvgf", 
  createdBy = "John Doe", 
  attr2 = Some(42), 
  attr3 = Some(LocalDate.parse("2018-11-03"))
)  // BaseModel(cff4545gvgf,John Doe,None,Some(42),Some(2018-11-03))
val hlist = LabelledGeneric[BaseModel].to(bm)
val hlist1 = hlist - 'attr1
val bm1 = LabelledGeneric[BaseModel1].from(hlist1)    
   // BaseModel1(cff4545gvgf,John Doe,Some(42),Some(2018-11-03))

但 Shapeless 无法创建新案例 class。如果您需要自动创建一个新案例 class,您可以编写一个宏。