通过java.time LocalDateTime进行比较/搜索

时间:2016-10-31 01:52:39

标签: mysql scala anorm

Anorm 2.5.2和 java.time LocalDateTime as date

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

我发现即使我在数据库中有相同的名称1和相同的日期时间(时刻),查询也会返回空users - 无法找到/匹配

所以似乎无法按日期时间进行比较。为什么会这样?

我能够正确地将local-date-time插入数据库(参见:related)到数据库中(我的意思是似乎db和scala类型之间的转换是打开的) - 即。我用:

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 :(得分:0)

确定。我的坏。

关于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。 (这只是我......):)