从SQL数据库中获取Scala中val的一个值

从SQL数据库中获取Scala中val的一个值,sql,database,postgresql,scala,playframework,Sql,Database,Postgresql,Scala,Playframework,我将play framework与postgreSQL结合使用,并尝试从表中的特定行和列中仅获取一个值。 程序在编译代码时没有问题,但是当调用带有此代码的操作时,它就是不起作用。SQL查询工作正常,我在psql中进行了检查 DB.withConnection { implicit connection => val selectSalt: Option[String] = SQL(""" select salt from devices where principa

我将play framework与postgreSQL结合使用,并尝试从表中的特定行和列中仅获取一个值。 程序在编译代码时没有问题,但是当调用带有此代码的操作时,它就是不起作用。SQL查询工作正常,我在psql中进行了检查

DB.withConnection { implicit connection =>
    val selectSalt: Option[String] = SQL("""
    select salt from devices
    where principal_id=(
              select id from principals 
              where principal={id})
    """).on(
    'id -> user).as(scalar[String].singleOpt)
…下面有更多代码请尝试以下操作:

.as(str("salt").singleOpt)
标量[String]对我来说效果很好,大致如下

DB.withConnection { implicit connection =>
  SQL("""
    select salt from devices
    where principal_id=(
      select id from principals 
      where principal={id})
  """).on('id -> user)
  .as(scalar[String].singleOpt) match {
    case Some(selectSalt) => println("Do something with selectSalt")
    case _ => println("No selectSalt found with id="+user)
  }
如果有多行可能满足principle={id}条件,则可以在SQL中使用limit 1。除了匹配,您还可以执行getOrElse,具体取决于您希望如何处理无行/空条件:

.as(scalar[String]).singleOpt).getOrElse("") // No Salt found with given id

你有错误吗?你在selectSalt中得到了什么?程序只是停止而不做任何事情,之后我有一个println命令,它没有显示你是否可能返回多行而不是一行?我猜用户是Int还是Long来匹配id?正如其他人所问的,您收到的确切错误是什么?我发现我试图获取的值为空,我填写了它,代码运行正常。但是为什么它在null时不工作呢?如果值为null,selectSalt应该包含一个None。不知道为什么它没有执行println。我用getOrElse尝试了第二个,但是当有空值时,程序就会冻结,就像以前一样:val-selectSignature:String=SQL-select-signature-from-devices-where-principal\u-id=select-id-from-principal={id}.on'id->user.asscalar[String].singleOpt.getorelsenull您有什么版本的play、scala和postgresql-可能会很有趣。。。?你能分享你的db表和案例类定义吗。