簡體   English   中英

如何檢查CachedRowSet中是否存在列名?

[英]How do I check to see if a column name exists in a CachedRowSet?

我正在查詢可能會發生變化的視圖中的數據。 在我執行crs.get******()之前,我需要知道列是否存在。我發現我可以查詢這樣的元數據,以便在我從中請求數據之前查看列是否存在。

ResultSetMetaData meta = crs.getMetaData();
int numCol = meta.getColumnCount();

for (int i = 1; i < numCol+1; i++) 
    if(meta.getColumnName(i).equals("name"))
        return true;

有沒有更簡單的方法來檢查列是否存在?

編輯:它必須是數據庫不可知的。 這就是我引用CachedRowSet而不是數據庫的原因。

一般的JDBC API沒有更簡單的方法(至少不是我所知道的,或者可以找到......我在我自己開發的工具集中有完全相同的代碼。)

(您的代碼不完整):

ResultSetMetaData meta = crs.getMetaData();
 int numCol = meta.getColumnCount();

for (int i = 1; i < numCol+1; i++) 
{
    if(meta.getColumnName(i).equals("name"))
    {return true;}

}
return false;

話雖這么說,如果您使用專有的,特定於數據庫的API和/或SQL查詢,我相信您可以找到更優雅的方式來做同樣的事情......但是您必須為每個數據庫編寫自定義代碼需要處理。 如果我是你,我會堅持使用JDBC API。

您提出的解決方案是否存在讓您認為不正確的問題? 這對我來說似乎很簡單......

如果列不在CachedRowSet中,你可以采用較短的方法來使用findColumn()為InvalidColumName拋出SQLException這一事實。

例如

 try {
     int foundColIndex = results.findColumn("nameOfColumn");
} catch {
  // do whatever else makes sense
}

可能是濫用異常處理(根據EffectiveJava第2版第57項),但它是循環遍歷元數據中所有列的替代方法。

哪個數據庫?

我認為在Oracle中有列出列的表。

我不記得它是否適用於視圖,但我猜他們這樣做,它是這樣的:

select colum_name from all_views where view_name like 'myview'

要么

select name from all_objects where object_name like 'myview' and object_type='view'

我不記得確切的語法。 你應該有空間權限。

每個RDBMS都應該有類似的東西。

您也可以執行查詢

select * from myView where 1 = 0 ; 

並且從元數據中獲取列,如果您希望它在以前知道列是否存在之前避免獲取數據。

不,真的沒有更好的方法。 您可能想要重新查看問題。 如果您可以重新定義問題,有時它會使解決方案更簡單,因為問題已經改變。

警告:以下評論純粹來自內存而沒有任何支持文書工作:)

如果我沒記錯的話,當oracle緩存的行集實現與連接池一起使用時,有一個神秘的問題會讓它變得如此丑陋。 似乎存在對緩存的行集對象中保持的連接的靜默引用(即使它應該斷開連接),這會關閉隨后在垃圾收集池中打開的另一個連接。 出於這個原因,我最終放棄並編寫了自己的數據對象層(這些天我將其交給spring和hibernate)。

舊線程,但我剛遇到同樣的問題,最終得到了一個實用功能:

private Set<String> getColumnNames(ResultSet cached) throws SQLException {
    ResultSetMetaData metaData = cached.getMetaData();
    return IntStream.range(1, metaData.getColumnCount())
                    .mapToObj(i -> {
                        try {
                            return metaData.getColumnName(i);
                        } catch (SQLException e) {
                            throw new RuntimeException(e);
                        }
                    }).collect(toSet());
}

如果我們不必在lambda中捕獲異常(沒有一些丑陋的黑客),這將是非常好的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM