以下Map器配置工作正常(mypojo没有其他构造函数)
class MyPojo {
private Long id;
private String name;
// No constructor
}
DynamicJdbcMapper<MyPojo> mapper = JdbcMapperFactory.newInstance().addKeys("id").newMapper(MyPojo.class);
ResultQuery<?> query = dsl
.select(
MY_TABLE.ID.as("id"),
MY_TABLE.NAME.as("name"))
.from(MY_TABLE).where(MY_TABLE.ID.eq(1));
MyPojo pojo = mapper.stream(query.fetchResultSet()).findFirst().orElse(null);
但在我的例子中,mypojo是一个遗留类,它附带了一大堆构造函数:
class MyPojo {
private Long id;
private String name;
public MyPojo(Long id) {
this.id = id;
}
}
这会导致Map器无法工作。我得到以下错误:
Could not find eligible property for 'name' on class com.bla.bla.MyPojo
很明显,Map程序正在尝试寻找参数与select子句中的每一列匹配的构造函数。我不想添加重载构造函数(select列列表非常大)。
如何设置Map器来调用setter而不是构造函数?
1条答案
按热度按时间r8xiu3jd1#
simpleflatmapper解决方案
这个答案并不能帮助您使用simpleflatmapper实现这一点(我还不太了解),但是作为这个问题的未来访问者,可能会对现成的jooq解决方案感兴趣,我还是要回答这个问题。
现成的jooq解决方案
从jooq3.14开始,没有一种简单的方法可以防止jooq的错误
DefaultRecordMapper
而不是直接给属性赋值。从未来的jooq版本开始,这将是可能的:https://github.com/jooq/jooq/issues/10349由于您已经为查询的所有列设置了别名,因此可以添加一个带注解的构造函数
@ConstructorProperties
以及查询中的确切名称集:我知道你说过你不想添加更多的构造函数,但是也许,你可以用ide生成这个?