我在这里使用
scala和slick,并且我有一个baserepository,负责执行我的类的基本crud.
对于设计决策,我们确实有updateTime和createdTime列全部由应用程序处理,而不是由数据库中的触发器处理.这两个字段都是joda DataTime实例.
这些字段在表中以两个特征(称为HasUpdatedAt和HasCreatedAt)定义
对于设计决策,我们确实有updateTime和createdTime列全部由应用程序处理,而不是由数据库中的触发器处理.这两个字段都是joda DataTime实例.
这些字段在表中以两个特征(称为HasUpdatedAt和HasCreatedAt)定义
trait HasCreatedAt { val createdAt: Option[DateTime] } case class User(name:String,createdAt:Option[DateTime] = None) extends HasCreatedAt
我想知道如何使用反射来调用用户复制方法,以在数据库插入方法期间更新createdAt值.
在@vptron和@ kevin-wright评论之后编辑
我有这样的回购
trait BaseRepo[ID,R] { def insert(r: R)(implicit session: Session): ID }
我只想实现插入一次,并且我想创建它以进行更新,这就是为什么我没有使用复制方法,否则我需要在使用createdAt列的任何地方实现它.
解决方法
这个问题在这里得到了回答,以帮助其他人解决这类问题.
我最终使用此代码使用scala反射执行我的case类的复制方法.
我最终使用此代码使用scala反射执行我的case类的复制方法.
import reflect._ import scala.reflect.runtime.universe._ import scala.reflect.runtime._ class Empty val mirror = universe.runtimeMirror(getClass.getClassLoader) // paramName is the parameter that I want to replacte the value // paramValue is the new parameter value def updateParam[R : classtag](r: R,paramName: String,paramValue: Any): R = { val instanceMirror = mirror.reflect(r) val decl = instanceMirror.symbol.asType.toType val members = decl.members.map(method => transformMethod(method,paramName,paramValue,instanceMirror)).filter { case _: Empty => false case _ => true }.toArray.reverse val copyMethod = decl.declaration(newTermName("copy")).asMethod val copyMethodInstance = instanceMirror.reflectMethod(copyMethod) copyMethodInstance(members: _*).asInstanceOf[R] } def transformMethod(method: Symbol,paramValue: Any,instanceMirror: InstanceMirror) = { val term = method.asTerm if (term.isAccessor) { if (term.name.toString == paramName) { paramValue } else instanceMirror.reflectField(term).get } else new Empty }
有了这个,我可以执行我的案例类的复制方法,替换确定的字段值.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。