我有一个名为的表Tags
,它将“标签”存储为一行,无论它们代表什么特定的子类。一些行代表 modbus 标签,一些 snmp,一些其他协议。从 Tag 继承的所有类都将它们的数据存储在这个表中,未使用的列只包含空值。
目前,我有类似的 DAO 方法,getAllModBusTags()
其中包含一个指令mapToBean(ModBusTag.class)
。最终,所有 Tag 的子类都从数据库中获取(每个协议一次获取),然后添加到超类型 Tag 的 ArrayList 中。
我的问题是,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;
}