我正在查看可能会发生变化的视图中的数据。在我执行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
而不是数据库的原因。
答案 0 :(得分:8)
使用通用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。
您提出的解决方案是否存在让您认为不正确的问题?这对我来说似乎很简单......
答案 1 :(得分:8)
如果列不在CachedRowSet中,你可以采用较短的方法来使用findColumn()为InvalidColumName抛出SQLException这一事实。
例如
try {
int foundColIndex = results.findColumn("nameOfColumn");
} catch {
// do whatever else makes sense
}
可能滥用异常处理(根据EffectiveJava第2版第57项),但它可以替代循环使用元数据中的所有列。
答案 2 :(得分:1)
哪个数据库?
我认为在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 ;
从元数据中获取列,如果您希望它在避免获取数据之前知道列是否存在。
答案 3 :(得分:1)
不,确实没有更好的方法。您可能想要重新查看问题。如果您可以重新定义问题,有时它会使解决方案更简单,因为问题已经改变。
答案 4 :(得分:0)
警告:在没有任何支持性文书工作的情况下,纯粹从记忆中发表评论:)
如果我没记错的话,当oracle缓存的行集实现与连接池一起使用时,有一个神秘的问题会让它变得如此丑陋。似乎存在对缓存的行集对象中保持的连接的静默引用(即使它应该断开连接),这会关闭随后在垃圾收集池中打开的另一个连接。出于这个原因,我最终放弃并编写了自己的数据对象层(这些天我将其交给spring&amp; hibernate)。
答案 5 :(得分:0)
旧线程,但我刚遇到同样的问题,最后得到了一个实用功能:
RESULT TABLE
-----------------------------------------
| ReceiptId | JobId | SK | Clicks Count |
|-----------|-------|------|--------------|
| 0000001 | 67789 | 4151 | 3 |
|-----------|-------|------|--------------|
| 0000002 | 67789 | 4151 | 2 |
|-----------|-------|------|--------------|
| 0000003 | 67789 | 4151 | 1 |
-----------------------------------------
如果我们不必在lambda中捕获异常(没有一些丑陋的黑客攻击),这将是非常好的。
答案 6 :(得分:0)
下面是贾里德(Jared)在此主题中的最高答案,以及corsiKa对它的低估评论之一:
ResultSetMetaData meta = crs.getMetaData();
int numCol = meta.getColumnCount();
Set<String> columns = new HashSet<>;
for (int i = 1; i <= numCol; i++)
{
columns.add(meta.getColumnName(i));
}
return columns.contains("name");