I'm using anorm to save and query a Message. It can be saved, but
can't be queried.
The code is:
Message.scala
============
case class Message(
id: Pk[String] = NotAssigned,
username: Option[String] = None,
accountQQNumber: Option[String] = None,
accountOther: Option[String] = None,
content: String,
messageType: String = Message.MESSAGE_TYPE_NEW_CREATED, //
imported_text, imported_html, new_created
createdAt: Date,
updatedAt: Option[Date] = None,
userId: Option[String] = None) {
}
object Message {
val MESSAGE_TYPE_NEW_CREATED = "new_created"
val MESSAGE_TYPE_IMPORTED_TEXT = "imported_text"
val MESSAGE_TYPE_IMPORTED_HTML = "imported_html"
val simple = {
get[Pk[String]]("
messages.id") ~
get[Option[String]]("messages.username") ~
get[Option[String]]("messages.account_qqnumber") ~
get[Option[String]]("messages.account_other") ~
get[String]("messages.content") ~
get[String]("messages.message_type") ~
get[Date]("messages.created_at") ~
get[Option[Date]]("messages.updated_at") ~
get[Option[String]]("messages.user_id") map {
case id ~ username ~ accountQQNumber ~ accountOther ~ content
~ messageType ~ createdAt ~ updatedAt ~ userId =>
Message(id = id, content = content, createdAt = createdAt,
username = username, userId = userId, accountQQNumber =
accountQQNumber,
accountOther = accountOther, messageType = messageType,
updatedAt = updatedAt)
}
}
def findById(id: String): Option[Message] = {
DB.withConnection { implicit connection =>
return SQL("select * from messages where id = {id}").on(
'id -> id).as(Message.simple.singleOpt)
}
}
def create(message: Message): Message = {
DB.withConnection { implicit connection =>
val id = newId();
SQL(
"""
insert into messages (
id, username, account_qqnumber, account_other, content,
message_type, created_at, updated_at, user_id
) values (
{id}, {username}, {accountQQNumber}, {accountOther},
{content}, {messageType}, {createdAt}, {updatedAt}, {userId}
)
""").on(
'id -> id,
'username -> message.username,
'accountQQNumber -> message.accountQQNumber,
'accountOther -> message.accountOther,
'content -> message.content,
'messageType -> message.messageType,
'createdAt -> message.createdAt,
'updatedAt -> message.updatedAt,
'userId -> message.userId).executeUpdate()
message.copy(id = Id(id))
}
}
}
The test is used "scalatest":
BaseSuite.scala
============
@RunWith(classOf[JUnitRunner])
class BaseSuite extends FlatSpec with ShouldMatchers
with BeforeAndAfterEach with BeforeAndAfterAll {
protected def fakeApp = FakeApplication(additionalConfiguration =
Map(
("db.default.url") -> ("jdbc:postgresql://localhost:35432/
shuzu2_test")))
MessageTest.scala
===============
class MessageTest extends BaseSuite {
"Message" should "be found by id" in {
running(fakeApp) {
val message = Message.create(new Message(
content = "Hello, world!",
createdAt = new Date))
val generatedId = message.id.get
println("id: " + generatedId)
val found = Message.findById(generatedId)
found should not be (None)
found.get.content should be("Hello, world!")
}
}
But the test is always failed on this line:
found should not be (None)
The error message is:
None was equal to None
Seems it can't found that message by id, but I've checked the
database, it's there.
There is no detailed document for anorm, and I've spent several hours
on it.
Please help me, thanks!