我使用Model Mapper和JDBI,但是我无法将模型映射器与SQL对象查询一起使用。
例如,我有这个选择
select 'select count(*) "'||owner||'"."'||table_name||'";'
from dba_tables;
和文档说我必须使用ResultSetMapper或ResultSetMapperFactory来映射结果。
我想编写一个使用模型映射器的映射器,但是如果可以的话,我有一些问题需要理解(下面的代码不起作用)。
这是ExampleMapper类中的方法(与SqlObject一起使用的注释是
@SqlQuery("select * from example")
)
@RegisterMapper(ExampleMapper.class)
如何使用模型映射器映射resultSet? 谢谢, 西尔维娅
答案 0 :(得分:1)
问题是模型映射器'map'方法在一次调用中处理结果集中的所有记录,而jdbi'map'函数期望'map'方法一次处理单个结果行。实际效果是模型映射器在第一次调用时贪婪地读取结果集中的所有记录。这会导致结果集在传递回modelmapper时已经关闭,因此jdbi会抛出错误。
然而,这很容易分两步完成,这不是很简单,但比使用jdbi或modelmapper的代码搞得容易得多。最终的结果就是我想要的 - 一种从数据库到java的非常简单的方法,而不必手动输入大量的字段名来进行映射。
第一步是在sql对象api接口声明中使用默认映射器,它将返回一个映射列表。
@SqlQuery("select product_id, title from product where product_id = :id ")
@Mapper(DefaultMapper.class)
public List<Map<String, Object>> getProductDetails(@Bind("id") long id);
ModelMapper非常满意地图列表,因此代码中的其他地方使用模型映射器将结果转换为所需类型。我为JDBI Sql对象接口包装了一个真正的DAO,因此隐藏了jdbi接口。转换本身可以使用通用方法完成,您可以将其重复用于任何转换为bean / pojos列表。
public static <T> List<T> map(Class<T> clazz, List<Map<String, Object>> data) {
ModelMapper modelMapper = new ModelMapper();
modelMapper.getConfiguration().setSourceNameTokenizer(NameTokenizers.UNDERSCORE);
List<T> result = modelMapper.map(data, new TypeToken<List<T>>() {}.getType());
return result;
}
public List<Product> getProductDetails(long id) {
return ListMapper.map(Product.class, productDBI.getProductDetails(id));
}