我可以使用@MapResultAsBean
注释将jdbi查询的结果映射到我感兴趣的bean,如下所示:
@SqlQuery("select * from some_table where id = :some_id")
@MapResultAsBean
SomeBean findById(@Bind("some_id") String someId);
如果应用程序中使用的jdbi
实例尚未在任何自定义映射器中注册,则此方法可以正常工作。
但我正在处理的应用程序有一个自定义映射器,如下所示:
class CustomMapperFactory implements ResultSetMapperFactory {
// Override methods to provide custom conversion logic
}
此映射器在应用程序开头的jdbi
实例中注册,如下所示:
final DBIFactory factory = new DBIFactory();
final DBI jdbi = factory.build(environment, conf.getDatabase(), "postgresql");
jdbi.registerMapper(new CustomMapperFactory());
CustomMapperFactory
覆盖方法并提供逻辑以将任何类型的结果从数据库转换为相关的bean类型。只有这一个uber转换器才能在整个应用程序中处理所有DB到POJO的转换。
我的问题是:
我是否有办法告诉jdbi
继续使用此CustomMapperFactory
将结果从数据库转换为除SomeBean
类型以外的所有类型的bean。 < / p>
我尝试添加@MapResultAsBean
CustomMapperFactory
仍在jdbi
注册。该程序运行,但注册jdbi
的自定义映射器优先,@MapResultAsBean
完全没有效果,只是被忽略。
在互联网上找不到太多关于它的信息。有帮助吗?我们使用dropwizard-jdbi-1.2.2
和显然postgres
数据库。
答案 0 :(得分:2)
您可以通过以下几种方式完成此操作:
一个。告诉JDBI您的CustomMapperFactory
没有映射类型SomeBean
。这样,JDBI将回归使用@MapResultAsBean
:
public class CustomResultMapperFactory implements ResultSetMapperFactory {
@Override
public boolean accepts(Class type, StatementContext ctx) {
if (type == SomeBean.class) {
return false;
}
//....
}
}
或
湾明确返回BeanMapper
类型的SomeBean
:
public class CustomResultMapperFactory implements ResultSetMapperFactory {
@Override
public ResultSetMapper mapperFor(Class type, StatementContext ctx) {
if (type == SomeBean.class) {
return new BeanMapper(type);
}
// ..
}
}
请注意,在这种情况下,您不需要@MapResultAsBean
注释。