【问题标题】:Any better, more idiomatic way to convert SQL ResultSet to a Scala List or other collection type?将 SQL ResultSet 转换为 Scala List 或其他集合类型有更好、更惯用的方法吗?
【发布时间】:2018-06-28 07:27:48
【问题描述】:

我正在使用以下幼稚代码将 ResultSet 转换为 Scala List

val rs = pstmt.executeQuery()
var nids = List[String]()
while (rs.next()) {
  nids = nids :+ rs.getString(1)
}
rs.close()

有没有更好的方法,更符合 Scala 的习惯,不需要使用可变对象?

【问题讨论】:

  • 为什么不使用像 Slick 或 Quill 这样的映射器库?它会让你的生活更轻松!
  • 我在Spark executors中使用它,所以我更喜欢同步模式;因为我需要使用 PostGIS 扩展 Postgres,所以使用普通 SQL 更容易开始。所以我回到旧的 JDBC 连接。
  • 不知道它有帮助,但使用这个 query.execute query.getResultList.asScala.toList

标签: scala jdbc


【解决方案1】:

在评论部分使用像slickQuill这样的ORM工具被认为是更好的方法。

如果你想使用 Scala 代码来处理 ResultSet。你可以使用tailRecursion

@scala.annotation.tailrec
def getResult(resultSet: ResultSet, list: List[String] = Nil): List[String] = {
  if (resultSet.next()) {
    val value = resultSet.getString(0)
    getResult(resultSet, value :: list)
  }
  else {
    list
  }
}

此方法返回包含第 0 位列值的字符串列表。这个过程是完全不可变的,所以你不必担心。从好的方面来说,这个方法是尾递归,所以 Scala 会在内部相应地优化这个方法。

谢谢

【讨论】:

  • 使用 ORM 并不是“最好的方法”。这取决于项目的类型和规模,并且通常会引入并不总是值得麻烦的复杂性。
  • 同意,@Kraylog。实际上,我正在使用 PostGIS 对 PostgreSQL 的扩展,用于空间和地理查询;有一些 DSL 函数,我可能对 ORM 感到不舒服。
  • 我有 40 个字段的选择查询,我可以应用这个逻辑来获取所有字段吗?
【解决方案2】:

你为什么不试试这个:

new Iterator[String] {
  def hasNext = resultSet.next()
  def next() = resultSet.getString(1)
}.toStream

取自这个答案here

【讨论】:

  • 当我使用这个函数时,然后在迭代器上“映射”(从返回的列创建一个对象 - (或使用用于理解/yield),然后添加一个 .toVector -我的向量总是丢失第一条记录。
  • 如何将结果集中的多列转换为数组? next() 将从迭代器中删除元素
  • 可以在 next => def next() = (resultSet.getString(1), resultSet.getString(2))中返回一个元组
  • @GavinBaumanis 是对的:我正在做 new Iterator[Employee] { def hasNext = rs.next() def next() = Employee(rs.getString("name"), rs.getInt( “年龄”))}.toStream。它正在跳过一条记录
【解决方案3】:

我有类似的问题,我的解决方案是:

Iterator.from(0).takeWhile(_ => rs.next()).map(_ => rs.getString(1)).toList

希望这会有所帮助。

【讨论】:

  • 我觉得这种做法,跳过一条记录
猜你喜欢
  • 2020-03-04
  • 1970-01-01
  • 2014-07-27
  • 2017-01-10
  • 1970-01-01
  • 1970-01-01
  • 2019-06-02
  • 2020-12-25
  • 1970-01-01
相关资源
最近更新 更多