У меня есть единственная таблица с именем Tags
, в которой тег хранится в виде строки, независимо от того, какой конкретный подкласс они представляют. Некоторые строки представляют теги modbus, некоторые snmp, некоторые другие протоколы. Все классы, унаследованные от Tag, хранят свои данные в этой одной таблице, а неиспользуемые столбцы просто содержат нулевые значения.
На данный момент у меня есть такие методы DAO, как getAllModBusTags()
, которые содержат инструкцию mapToBean(ModBusTag.class)
. В конце концов все подклассы Tag извлекаются из базы данных (по одному на каждый протокол), а затем добавляются в список ArrayList надтипа Tag.
Мой вопрос заключается в том, есть ли в Jdbi простое средство для выполнения условного сопоставления строк, чтобы, если строка содержит определенное значение, она сопоставлялась с ModBusTag.class, а если строка содержала другое значение, она сопоставлялась с SNMPTag.class, и так далее и тому подобное?
Моя конечная цель состоит в том, чтобы иметь единый оператор выбора, который извлекает каждый тег из базы данных, автоматически сопоставляется с правильным bean-компонентом построчно, а затем сохраняет все эти bean-компоненты подкласса в списке тегов супертипа.
Пример метода для одного типа:
@Override
public List<SNMPTag> getSNMPTags(){
try(Handle handle = daoFactory.getDataSourceController().open()) {
return handle.createQuery("SELECT * FROM dbo.Tags WHERE Active = 1 AND Protocol = 'SNMP'")
.mapToBean(SNMPTag.class)
.list();
}
catch(Exception e){
if(sysconfig.getVerbose()){ e.printStackTrace(); }
}
return null;
}
Какой-то плохой псевдокод, чтобы указать, что я хочу сделать:
@Override
public List<Tag> getAllTags(){
try(Handle handle = daoFactory.getDataSourceController().open()) {
return handle.createQuery("SELECT * FROM dbo.Tags WHERE Active = 1")
.mapRows(row -> row.Protocol.equals("SNMP").mapToBean(SNMPTag.class)
.mapRows(row -> row.Protocol.equals("ModBus").mapToBean(ModBusTag.class)
//etc
.list();
}
catch(Exception e){
if(sysconfig.getVerbose()){ e.printStackTrace(); }
}
return null;
}