【问题标题】:NullPointerException when Plain SQL and String Interpolation纯 SQL 和字符串插值时出现 NullPointerException
【发布时间】:2013-05-24 06:01:20
【问题描述】:

我在使用字符串插值执行普通 SQL 查询时遇到了一些麻烦。我正在尝试使用 Microsoft 的 sqljdbc4.jar 查询 MS-SQL 2008 数据库。

表格很简单:

[serv_num]
number (nvarchar(15))  |  name (nvarchar(50))
=============================================
    1234               |     AA
    +345               |     BB

我使用的代码如下:

import java.sql.{Connection, DriverManager}
import org.slf4j.LoggerFactory
import scala.collection.JavaConversions._
import scala.slick.session.Database
import Database.threadLocalSession
import scala.slick.jdbc.{GetResult, StaticQuery => Q}
import Q.interpolation

object NumImport extends App {
    def logger = LoggerFactory.getLogger("NumImport")
    implicit val getServNumResult = GetResult(r => ServNum(r.<<, r.<<))

    override def main(args: Array[String]) {
        val uri = "jdbc:sqlserver://192.168.1.2;databaseName=slicktestdb;user=yyyy;password=xxxxxx"
        val drv = "com.microsoft.sqlserver.jdbc.SQLServerDriver"

        Database.forURL(uri, driver = drv) withSession {
           def getServNum(n: String) = sql"select number, name from serv_num where number = $n".as[ServNum]
           val result = getServNum("1234")
           println(result.firstOption)
        }
    }

    case class ServNum(num: String, name: String)
}

我的问题是我在result.firstOption 上收到了java.lang.NullPointerException(我想!)。当找到一行时会发生这种情况。如果尝试选择一个不存在的数字,比如getServNum("34"),那么result.firstOption 就是None,正如预期的那样。

堆栈跟踪:

08:54:47.932 TKD [run-main] DEBUG scala.slick.session.BaseSession - Preparing statement: select number, name from serv_num where number = ?
[error] (run-main) java.lang.NullPointerException
java.lang.NullPointerException
at scala.slick.jdbc.StaticQuery.extractValue(StaticQuery.scala:16)
at scala.slick.jdbc.StatementInvoker$$anon$1.extractValue(StatementInvoker.scala:37)
at scala.slick.session.PositionedResultIterator.foreach(PositionedResult.scala:212)
at scala.slick.jdbc.Invoker$class.foreach(Invoker.scala:91)
at scala.slick.jdbc.StatementInvoker.foreach(StatementInvoker.scala:10)
at scala.slick.jdbc.Invoker$class.firstOption(Invoker.scala:41)
at scala.slick.jdbc.StatementInvoker.firstOption(StatementInvoker.scala:10)
at scala.slick.jdbc.UnitInvoker$class.firstOption(Invoker.scala:148)
at scala.slick.jdbc.StaticQuery0.firstOption(StaticQuery.scala:95)

我尝试调试并跟踪堆栈跟踪,但我对 Scala 和 Slick 都很陌生,所以我迷路了。如果有人可以帮助我或为我指明正确的方向,我将不胜感激。

谢谢。

【问题讨论】:

  • 在该行中选择的列是否为空值和/或它们是否允许空值?
  • 它们都不允许空值。
  • 您介意将您的两个案例类字段都切换为Option[String 而不是String,然后再试一次吗?
  • 在将案例类字段切换到 Option[String] 时,我得到了相同的 NullPointerException。
  • 我想我知道它是什么。我会在这里发表评论。如果可行,请告诉我,我将添加作为答案。将您的案例类定义移到对象之外,因此它不会像现在这样绑定到它。

标签: scala slick


【解决方案1】:

在查看异常发生的流畅源代码时,我可以看到它试图在GetResult 对象上调用apply,但该对象似乎为空。在考虑可能导致它的原因时,我建议您移动 main 方法的隐式内部。似乎事情的结构方式,光滑正在失去对隐式 ResultSet 到案例​​类转换器(GetResult)的跟踪

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    相关资源
    最近更新 更多