Я работаю с Slick 3.1.1, и проблема в том, что в некоторых случаях я хочу опустить некоторые столбцы, которые довольно тяжелы и по-прежнему материализуют это подмножество столбцов как кейс класс.Slick 3.1 - Получение подмножества столбцов как класса case
Рассмотрим следующее определение таблицы:
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
, который опускает эти столбцы, несмотря на все мои усилия, я не мог сделать эту работу. Я чувствую, что это так: должен быть правильным подходом - однажды у меня была «рабочая» проекция. У меня все еще была ошибка Slick «Нет соответствующей формы. Slick не знает, как сопоставить данные типы » - Построение иерархии классов с абстрактным классом
AuditResultTableBase
и двумя вытекающими из него классами - один, который добавляет« тяжелые »столбцы и один без них, оба с их соответствующей проекцией по умолчанию и классов случаев. Это работает хорошо, но подход кажется неправильным и требует относительно большого изменения кода для такой легкой вещи. - Материализация кортежей вместо классов корпуса - это, конечно, будет работать, но я хочу, чтобы уровень доступа к данным был строго типизирован.
Какая идиоматическая/лучшая практика для Slick 3.1 для решения этой проблемы? Могу ли я использовать пользовательскую проекцию для этого, и если да, то что бы это выглядело для этого конкретного примера/запроса с SystemAOutput
и SystemBOutput
, являющимися тяжелыми столбцами, которые я хочу опустить?
Спасибо Wojciech. Я надеялся, что будет «один» явно правильный ответ, но, похоже, я не единственный, у кого проблемы. Спасибо за понимание того, как правильно реализовать форму/сопоставление для этого варианта использования (даже если IntelliJ не нравится) - щедрость - это все ваше. – BrokenGlass