我有一個通用存盤庫,其方法為:
object Queries {
def getByFieldId(field: String, id: Int): String = {
s"""
|SELECT
| DF.id AS fileId,
| DF.name AS fileName,
| AG.id AS groupId,
| AG.name AS groupName
|FROM $tableName DFG
|INNER JOIN directory_files DF on DF.id = DFG.file_id
|INNER JOIN ad_groups AG on AG.id = DFG.group_id
|WHERE DFG.$field = $id
|""".stripMargin
}
}
def getByFieldId(field: String, id: Int): Try[List[Object]] = {
try {
val sqlQuery = Queries.getByFieldId("ad_group", 1)
statement = conn.getPreparedStatement(sqlQuery)
setParameters(statement, params)
resultSet = statement.executeQuery()
val metadata = resultSet.getMetaData
val columnCount = metadata.getColumnCount
val columns: ListBuffer[String] = ListBuffer.empty
for (i <- 1 to columnCount) {
columns = metadata.getColumnName(i)
}
var item: List[Object] = List.empty
while (resultSet.next()) {
val row = columns.toList.map(x => resultSet.getObject(x))
item = row
}
Success(item)
} catch {
case e: Any => Failure(errorHandler(e))
} finally conn.closeConnection(resultSet, statement)
}
問題是我的結果集忽略查詢別名并回傳列(id, name, id, name)而不是(fileId, fileName, groupId, groupName).
找到的一種解決方案是使用列索引而不是列名稱,但我不確定該解決方案是否會覆寫整個應用程式并且不會破壞其他一些查詢。
也許,另一個找到的解決方案在這里,如果我是對的,我仍然可以使用 colNames 但需要將它們與 colTypes 放在一起,然后在內部為每個resultSet.next()呼叫getType方法:
// this part of code is not tested
// this idea came to me writing this topic
while (resultSet.next()) {
val row = columns.toList.map(x => {
x.colType match {
case "string" => resultSet.getString(x.colName)
case "integer" => resultSet.getInt(x.colName)
case "decimal" => resultSet.getDecimal(x.colName)
case _ => resultSet.getString(x.colName)
})
item = row
}
uj5u.com熱心網友回復:
您可以嘗試使用getColumnLabel代替getColumnName
作為記錄
獲取指定列的建議標題以用于列印輸出和顯示。建議的標題通常由 SQL AS 子句指定。如果未指定 SQL AS,則 getColumnLabel 回傳的值將與 getColumnName 方法回傳的值相同。
請注意,這高度依賴于使用的RDBM.
對于Oracle這兩種方法都回傳別名并且沒有機會獲得原始列名。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/366276.html
