我用油滑3.1.1和问题的工作是,在某些情况下,我想省略一些列是相当沉重的,仍然兑现列的子集作为案例分类。油滑3.1 - 检索列的子集作为一个案例类
考虑下面的表定义:
class AuditResultTable(tag: Tag) extends Table[AuditResult](tag, AuditResultTableName) {
def auditResultId: Rep[Long] = column[Long]("AuditResultId", O.PrimaryKey, O.AutoInc)
def processorId: Rep[Long] = column[Long]("ProcessorId")
def dispatchedTimestamp: Rep[Timestamp] = column[Timestamp]("DispatchedTimestamp", O.SqlType("timestamp(2)"))
def SystemAOutput: Rep[Array[Byte]] = column[Array[Byte]]("SystemAOutput", O.SqlType("LONGBLOB"))
def SystemBOutput: Rep[Array[Byte]] = column[Array[Byte]]("SystemBOutput", O.SqlType("LONGBLOB"))
def isSuccessful: Rep[Boolean] = column[Boolean]("IsSuccessful")
def * : ProvenShape[AuditResult] = (processorId, dispatchedTimestamp, systemAOutput, systemBOutput, isSuccessful, auditResultId) <>
(AuditResult.tupled, AuditResult.unapply)
}
val auditResults = TableQuery[AuditResultTable]
相应的案例类:
case class AuditResult (
ProcessorId: Long,
DispatchedTimestamp: Timestamp,
SystemAOutput: Array[Byte],
SystemBOutput: Array[Byte],
IsSuccessful: Boolean,
AuditResultId: Long = 0L
)
最后的数据访问查询:
def getRecentFailedAuditsQuery(): Query[AuditResultTable, AuditResult, Seq] = {
auditResults.filterNot(r => r.isSuccessful)
}
我考虑过,看着出现的选项in this (outdated) answer和其他:
- 具有与映射到“
AuditResult
的轻版本”的默认投影不同的投影,例如,AuditResultLight
省略了这些列 - 尽管我不能做这样的工作,我最大的努力 - 我觉得这应该是正确的做法 - 我曾有过一个“工作”的投影我还有一个漂亮的错误“找不到匹配的形状。油滑不知道如何映射“,从它派生 - 建设类层次结构与抽象
AuditResultTableBase
类两大类 - 一个,增加了‘给定类型的重磅’列和一个没有他们,都与各自的默认的投影和案例分类。这很好地工作,但这种方法似乎是错误的,并且需要对这样一个简单的事情进行相对较大的代码更改。 - 物化元组,而不是case类 - 这当然会的工作,但我想是强类型我的数据访问层。
对于这个问题,Slick 3.1的惯用/最佳实践是什么?我可以使用自定义投影此,如果这样你会看起来像这个特殊的例子/查询与SystemAOutput
和SystemBOutput
是重列我想省略?
谢谢Wojciech--我本来希望能有一个明确正确的答案,但似乎我不是唯一有问题的人。感谢有关如何正确实现此用例的形状/映射的知识(即使IntelliJ不喜欢它) - 赏金是你的全部。 – BrokenGlass