То, что у вас есть, будет работать, пока hashtext
в hashtags
отображается как тип данных keyword
(или отображается как тип данных text
с включенными полевыми данными ), с оговорками, которые идут с делать это).
Вот рабочий пример
private static void Main()
{
var defaultIndex = "my_index";
var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
var settings = new ConnectionSettings(pool)
.DefaultIndex(defaultIndex);
var client = new ElasticClient(settings);
if (client.IndexExists(defaultIndex).Exists)
client.DeleteIndex(defaultIndex);
var createIndexResponse = client.CreateIndex(defaultIndex, c => c
.Mappings(m => m
.Map(mm => mm
.AutoMap()
)
)
);
var bulkResponse = client.Bulk(b => b
.IndexMany(new []
{
new Tweet
{
id = 1,
text = "foo",
hashtags = new List
{
new hashtags { hashtext = "aaaa" },
new hashtags { hashtext = "bbbb" },
new hashtags { hashtext = "cccc" }
}
},
new Tweet
{
id = 2,
text = "bar",
hashtags = new List
{
new hashtags { hashtext = "aaaa" },
new hashtags { hashtext = "bbbb" }
}
},
new Tweet
{
id = 3,
text = "baz",
hashtags = new List
{
new hashtags { hashtext = "aaaa" },
new hashtags { hashtext = "cccc" }
}
}
})
.Refresh(Refresh.WaitFor)
);
var searchResponse = client.Search(s => s
.Size(0)
.Aggregations(childAggs => childAggs
.Nested("hashtags", n => n
.Path(p => p.hashtags)
.Aggregations(nestedAggs => nestedAggs
.Terms("by_tags", t => t
.Field(f => f.hashtags.First().hashtext)
)
)
)
)
);
var hashtagBuckets = searchResponse.Aggregations.Nested("hashtags").Terms("by_tags").Buckets;
foreach(var bucket in hashtagBuckets)
{
Console.WriteLine($"{bucket.Key}\t{bucket.DocCount} times");
}
}
public class Tweet
{
public ulong id { get; set; }
public string text { get; set; }
[Nested]
public List hashtags { get; set; }
}
public class hashtags
{
[Keyword]
public string hashtext { get; set; }
}
, который пишет следующее в консоль
aaaa 3 times
bbbb 2 times
cccc 2 times
Нет более простого пути с общим API JDBC (по крайней мере, не, что я знаю об или могу найти... У меня есть точно тот же код в моем наборе инструментов собственной разработки.)
(Ваш код не завершен):
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;
Однако если Вы используете и/или SQL-запросы собственного, определенного для базы данных API, я уверен, что можно найти более изящные способы сделать то же самое..., но необходимо было бы записать пользовательский код для каждой базы данных, с которой необходимо иметь дело. Я придерживался бы API JDBC на вашем месте.
Есть ли что-то о Вашем предлагаемом решении, которое заставляет Вас думать, что это неправильно? Это кажется достаточно простым мне...
Какая база данных?
Я думаю в 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 ;
И от метаданных получают столбцы, если, что Вы хотите, чтобы они постарались не выбирать данные прежде, чтобы знать, присутствуют ли столбцы.
Нет, действительно нет лучшего пути. Можно хотеть повторно посмотреть на проблему. Если можно переопределить проблему, иногда она делает решение более простым, потому что проблема изменилась.
ПРЕДУПРЕЖДЕНИЕ: следующий комментарий - чисто по памяти без каких-либо подтверждающих документов:)
Если я правильно помню, существует загадочная проблема, которая поднимает свою очень уродливую голову, когда оракул кэширует набор строк реализация используется с пулом соединений. Похоже, есть безмолвная ссылка на соединение, содержащееся в кэшированном объекте набора строк (даже если оно должно быть отключено), которое закрывает другое соединение, впоследствии открытое из пула при сборке мусора. По этой причине я в конце концов сдался и написал свой собственный уровень объекта данных (в наши дни я передал его в spring и hibernate).