Scala Slick находит все даты и время меньше, чем DateTime.now()

Я пытаюсь написать краткий запрос Scala Slick, чтобы найти все даты, которые меньше текущего DateTime.now(). Я продолжаю получать проблемы с компиляцией, когда Column[DateTime] не сравним с обычным DateTime. Как правильно написать этот запрос Scala Slick?

Определение столбца

def expirationTime = column[DateTime]("EXPIRATION_TIME")

и запрос, который я пытаюсь написать:

table.filter(_.expirationTime < DateTime.now())

person Chris Stewart    schedule 23.02.2015    source источник


Ответы (1)


Я предполагаю, что вы используете lifted-embedding с Silk.

Итак... Slick использует концепцию под названием lifted-embedding, где ваши типы Scala являются lifted (изменены в более специфичный для предметной области тип) с использованием подходящего конструктора Rep для создания lifted-representation вашего типа Scala. Теперь для каждого столбца типа Column[ T ] есть подтип Rep[ T ], и должен существовать TypedType[ T ], который impliticty требуется для любого запроса.

Ваш конкретный запрос filter имеет следующую подпись:

def filter[T](f: (E) ⇒ T)(implicit wt: CanBeQueryCondition[T]): Query[E, E.TableElementType]

Здесь это неявное значение wt типа CanBeQueryCondition[T] является подтипом ( T ) => Column[ _ ] и используется внутри для поднятия (преобразования) вашего значения type T в Column[ T ]. Итак... вам нужно иметь implicit экземпляр CanBeQueryCondition[ DateTime ], чтобы выполнить этот запрос.

Помимо этого, для баз данных на основе JDBC по умолчанию поддерживаются только следующие примитивные типы.

Numeric types: Byte, Short, Int, Long, BigDecimal, Float, Double
LOB types: java.sql.Blob, java.sql.Clob, Array[Byte]
Date types: java.sql.Date, java.sql.Time, java.sql.Timestamp
Boolean
String
Unit
java.util.UUID

Это означает... что вам придется использовать java.sql.TimeStamp.

Или вы можете написать свой собственный маппер, который предоставит все шаблоны, необходимые для вашего столбца DataTime.

import scala.slick.driver.JdbcProfile.MappedColumnType
import java.sql.Date
import org.joda.time.DateTime 

object MyCustomMappers {

  implicit def dateTimeMapper = MappedColumnType.base[DateTime, Date] (
    { dateTime => new Date(dateTime.getMillis) },
    { date => new DateTime(date) }
  )

}

Теперь в вашей схеме вы можете просто указать import MyCustomMappers._, а затем определить столбцы типа DateTime. Теперь вы можете делать почти все, что вы можете делать с этими встроенными типами.

person sarveshseri    schedule 24.02.2015