我用油滑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