2016-10-31 3 views
0

Anorm 2.5.2 и java.time LocalDateTime как датаAnorm сравнить/поиск по java.time LocalDateTime

val users = SQL(
     s"SELECT * FROM user WHERE name={name} AND registered_date={registeredDate}").on(
     "name" -> user.name, 
     "registeredDate" -> user.registeredDate 
    ).executeQuery().as(userParser.*) 

Я обнаружил, что даже если у меня есть такая же name1 и тот же DateTime (момент) в база данных, запрос возвращается пустым users - не может найти/сопоставить.

Так что кажется, что он не может сравниться по дате. Почему это может быть?

Я смог правильно установить местное время-дату (см.: related) в базу данных (я имею в виду, что преобразование между типами db и scala включено) - I.e. Я использую:

import anorm.ParameterMetaData._ (который расширяет JavaTimeParameterMetaData)

Мой userParser:

val userParser: RowParser[User] = { 
    get[Option[Long]]("user.id") ~ 
     get[String]("user.name") ~ 
     get[LocalDateTime]("user.registered_date") map { 
     case id ~ name ~ registeredDate => 
     User(
      id = id , 
      name = name, 
      registeredDate = registeredDate 
     ) 
    } 
    } 

Мой пользователь:

case class User(id: Option[Long] = None, 
       name: String, 
       registeredDate: LocalDateTime 
       ) 
+1

Какую базу вы используете? Действительно ли сырой запрос работает? –

+0

mysql. когда я запрашиваю только по имени - у меня много пользователей. (потому что в моем db есть много пользователей с таким же именем). я думаю, мне нужно увидеть db-raw-queries, так как db получает их, чтобы увидеть, какие значения tt фактически сравниваются с – ses

+0

. Anorm, как и любая другая, основанная на JDBC lib, не сравнивает/не ищет строки сама по себе, а просто отправляет запрос в базу данных , поэтому добавьте отладку для регистрации значений параметров и проверьте запрос с этим. – cchantep

ответ

0

Ok. Виноват.

Речь идет о MYSQL и точности TIMESTAMP http://dev.mysql.com/doc/refman/5.5/en/datetime.html

Итак, в моем случае:

CREATE TABLE `user` (
    `id` BIGINT NOT NULL AUTO_INCREMENT, 
    `registered_date` TIMESTAMP(6) NOT NULL, 
    PRIMARY KEY (`id`)); 

здесь: Timestamp with a millisecond precision: How to save them in MySQL

я только объявить его TIMESTAMP(6) - что будет включать в себя миллисекунды.

Потому что в моем тесте:

"The User Repository" should "not create new user if it already exists" in { 

    val someTimeAgo = LocalDateTime.now 
    val userWithoultId1 = User(name = "name1", registeredDate = someTimeAgo) 
    val maybeUserWithId1 = userRepository.findOrCreate(userWithoultId1) 
    val maybeUserWithId2 = userRepository.findOrCreate(userWithoultId1) 
    maybeUserWithId1.get.id should === (maybeUserWithId2.get.id) 

LocalDateTime.now включает milieseconds, а также, очевидно

Так что я до сих пор люблю Anorm. (это просто я ..) :)

Смежные вопросы