java—允许simpleflatmapper忽略构造函数而只使用setter

yacmzcpb  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(387)

以下Map器配置工作正常(mypojo没有其他构造函数)

  1. class MyPojo {
  2. private Long id;
  3. private String name;
  4. // No constructor
  5. }
  1. DynamicJdbcMapper<MyPojo> mapper = JdbcMapperFactory.newInstance().addKeys("id").newMapper(MyPojo.class);
  2. ResultQuery<?> query = dsl
  3. .select(
  4. MY_TABLE.ID.as("id"),
  5. MY_TABLE.NAME.as("name"))
  6. .from(MY_TABLE).where(MY_TABLE.ID.eq(1));
  7. MyPojo pojo = mapper.stream(query.fetchResultSet()).findFirst().orElse(null);

但在我的例子中,mypojo是一个遗留类,它附带了一大堆构造函数:

  1. class MyPojo {
  2. private Long id;
  3. private String name;
  4. public MyPojo(Long id) {
  5. this.id = id;
  6. }
  7. }

这会导致Map器无法工作。我得到以下错误:

  1. Could not find eligible property for 'name' on class com.bla.bla.MyPojo

很明显,Map程序正在尝试寻找参数与select子句中的每一列匹配的构造函数。我不想添加重载构造函数(select列列表非常大)。
如何设置Map器来调用setter而不是构造函数?

r8xiu3jd

r8xiu3jd1#

simpleflatmapper解决方案

这个答案并不能帮助您使用simpleflatmapper实现这一点(我还不太了解),但是作为这个问题的未来访问者,可能会对现成的jooq解决方案感兴趣,我还是要回答这个问题。

现成的jooq解决方案

从jooq3.14开始,没有一种简单的方法可以防止jooq的错误 DefaultRecordMapper 而不是直接给属性赋值。从未来的jooq版本开始,这将是可能的:https://github.com/jooq/jooq/issues/10349
由于您已经为查询的所有列设置了别名,因此可以添加一个带注解的构造函数 @ConstructorProperties 以及查询中的确切名称集:

  1. class MyPojo {
  2. private Long id;
  3. private String name;
  4. public MyPojo(Long id) {
  5. this.id = id;
  6. }
  7. @ConstructorProperties({ "id", "name" })
  8. public MyPojo(Long id, String name) {
  9. this.id = id;
  10. this.name = name;
  11. }
  12. }

我知道你说过你不想添加更多的构造函数,但是也许,你可以用ide生成这个?

展开查看全部

相关问题