我打算一次定义我的 Slick 查询并在需要时重用它们,但我遇到了 NullPointerException,我追踪到在同一个会话中使用了两次相同的 StaticQuery0 对象。Query 和 StaticQuery 对象是否意味着以这种方式重用?有没有更好的方法来解决这个问题(比如每次都创建一个新的查询对象?)或者我是否通过其他一些错误触发了异常?
以下是错误的详细信息。name.query 是通过 StaticQuery.queryNA 创建的 StaticQuery0。在不同的会话中重用它是有效的:
import Database.threadLocalSession
val points = db withSession {
name.query.to[Vector]
}
val points2 = db withSession {
name.query.to[Vector] // No problem!
}
在同一会话中再次使用它会引发 NullPointerException:
import Database.threadLocalSession
val points = db withSession {
name.query.to[Vector]
name.query.to[Vector] // Kablam!
}
这是一个例外:
java.lang.NullPointerException
at com.mysql.jdbc.ConnectionImpl.initializeResultsMetadataFromCache(ConnectionImpl.java:5552)
at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1368)
at scala.slick.jdbc.StatementInvoker.results(StatementInvoker.scala:34)
at scala.slick.jdbc.StatementInvoker.elementsTo(StatementInvoker.scala:17)
at scala.slick.jdbc.Invoker$class.foreach(Invoker.scala:90)
at scala.slick.jdbc.StatementInvoker.foreach(StatementInvoker.scala:10)
at scala.slick.jdbc.Invoker$class.build(Invoker.scala:66)
at scala.slick.jdbc.StatementInvoker.build(StatementInvoker.scala:10)
at scala.slick.jdbc.Invoker$class.to(Invoker.scala:74)
at scala.slick.jdbc.StatementInvoker.to(StatementInvoker.scala:10)
at scala.slick.jdbc.UnitInvoker$class.to(Invoker.scala:152)
at scala.slick.jdbc.StaticQuery0.to(StaticQuery.scala:
at (the second call to name.query.to[Vector])