2012-07-09 98 views
24

我一直在學習Play Framework,並且推薦的訪問數據庫的方式是使用anorm組件構建。事情是,對於日期時間在規範中沒有很好的支持。它仍在使用java.util.DateJoda DateTime播放框架2.0的Anorm

有沒有什麼辦法可以在anorm中使用Joda DateTime或java.sql.Timestamp?

如果沒有辦法使用Joda或java.sql,我們可以添加一個模塊嗎?

+0

@adis我認爲這是關於JPA,這是爲了... ... – bertzzie 2012-07-09 17:27:25

回答

41

更新:既然play 2.3.7現在是natively supported

我正在使用以下一段代碼與Anorm無縫地一起工作DateTime。

import org.joda.time._ 
import org.joda.time.format._ 
import anorm._ 

object AnormExtension { 


val dateFormatGeneration: DateTimeFormatter = DateTimeFormat.forPattern("yyyyMMddHHmmssSS"); 

implicit def rowToDateTime: Column[DateTime] = Column.nonNull { (value, meta) => 
    val MetaDataItem(qualified, nullable, clazz) = meta 
    value match { 
     case ts: java.sql.Timestamp => Right(new DateTime(ts.getTime)) 
     case d: java.sql.Date => Right(new DateTime(d.getTime)) 
     case str: java.lang.String => Right(dateFormatGeneration.parseDateTime(str)) 
     case _ => Left(TypeDoesNotMatch("Cannot convert " + value + ":" + value.asInstanceOf[AnyRef].getClass)) 
    } 
} 

implicit val dateTimeToStatement = new ToStatement[DateTime] { 
    def set(s: java.sql.PreparedStatement, index: Int, aValue: DateTime): Unit = { 
     s.setTimestamp(index, new java.sql.Timestamp(aValue.withMillisOfSecond(0).getMillis())) 
    } 
} 

} 

我認爲它應該明確地成爲Anorm的一部分,只需要磨光和更多的測試。 讓我知道它是否幫助了你。

+0

這有助於。非常感謝你。 – bertzzie 2012-08-18 04:37:34

+5

謝謝。你通常把這個代碼放在哪裏? – Arty 2013-07-21 17:54:22

+1

您只需將代碼放在某處(例如某個實用程序包),然後將其導入到您通過'import AnormExtension._'處理SQL語句和結果的位置。由於函數被定義爲「隱式」,Anorm將在範圍內自動使用它們進行轉換。 – notan3xit 2013-10-08 16:35:43