Scala 域类和slick生成的case类与Shapeless的转换

Scala 域类和slick生成的case类与Shapeless的转换,scala,slick,shapeless,Scala,Slick,Shapeless,Slick codegen生成一个方便的Tables.scala,其中包含行和表的所有类。我们喜欢这种方法,因为我们可以使用关系设计并充分利用我们选择的SQL方言的强大功能 但是,出于以下原因,我们正在编写大量的boiler plate代码,以将REST API模型/域API模型转换为光滑的XYZ行: Slick case类中的参数比domain case类中的参数多(这些额外的参数是从REST资源的路径中提取的) 我们不希望将路径相关类型公开给其他层/微服务。他们只需要知道RESTAPI模型

Slick codegen生成一个方便的Tables.scala,其中包含行和表的所有类。我们喜欢这种方法,因为我们可以使用关系设计并充分利用我们选择的SQL方言的强大功能

但是,出于以下原因,我们正在编写大量的boiler plate代码,以将REST API模型/域API模型转换为光滑的XYZ行:

  • Slick case类中的参数比domain case类中的参数多(这些额外的参数是从REST资源的路径中提取的)
  • 我们不希望将路径相关类型公开给其他层/微服务。他们只需要知道RESTAPI模型
  • 我们通常将日期和时间类从java.sql转换为java.time等效类
  • 我们可以自动化转换,这样我们就不必每次都明确地编写两个转换函数,从域模型到光滑的case类和viceversa。特别是:

  • 如何编写一个泛型函数,在具有相同HLIST表示的两个等价case类之间提供隐式转换

  • 我们如何在具有不同HLIST表示的两个case类之间编写通用隐式转换,为不同的成员(java.sql.Timestamp->java.time.ZonedDateTime)提供范围内的一组隐式转换

  • 我们如何编写一个函数在两个案例类之间进行转换,其中一个案例类的输出为Repr=HList1::HList2,而第一个案例类的输出为Repr=HList2(即,我们如何将从请求中提取的参数前置/追加到HList2?)


  • 有一些库可以做到这一点,您可以使用或阅读源代码进行学习。比如说