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

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

以下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而不是构造函数?

r8xiu3jd

r8xiu3jd1#

simpleflatmapper解决方案

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

现成的jooq解决方案

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

class MyPojo {
    private Long id;
    private String name;

    public MyPojo(Long id) {
        this.id = id;
    }

    @ConstructorProperties({ "id", "name" })
    public MyPojo(Long id, String name) {
        this.id = id;
        this.name = name;
    }
}

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

相关问题