gpt4 book ai didi

java - 在 RowMapper 中使用 BeanMapper?

转载 作者:行者123 更新时间:2023-12-04 10:43:18 27 4
gpt4 key购买 nike

我正在使用 JDBI 的 SQL 对象声明性 API 来映射包含一对多关系的对象:

class Foo {
private String id;
private String name;
private Set<Bar> bars = new HashSet<>();
}

class Bar {
private String id;
}

最初它看起来像一个 RowReducer将是理想的:
@UseFreemarkerSqlLocator
class FooQuery {

@SqlQuery
@RegisterBeanMapper(value = Foo.class, prefix = "f")
@RegisterBeanMapper(value = Bar.class, prefix = "b")
@UseRowReducer(RowReducer.class)
ResultIterator<Foo> queryAll();

static class RowReducer implements LinkedHashMapRowReducer<String, Foo> {

@Override
public void accumulate(Map<String, Foo> map, RowView rowView) {
final Foo foo = map.computeIfAbsent(rowView.getColumn("f_id", String.class),
id -> rowView.getRow(Foo.class));
if (rowView.getColumn("b_id", String.class) != null) {
foo.addBar(rowView.getRow(Bar.class));
}
}
}
}

然而我很快发现 RowReducer s 不适用于 ResultIterator s(我正在使用一个大型数据库,因此能够流式传输这些数据库很重要)所以现在我又回到实现 RowMapper反而。我还是想用方便的 BeanMapper s 内置在 JDBI 中,但我不知道如何从我的 RowMapper 中访问它们执行。
class FooRowMapper implements RowMapper<Foo> {
private Foo foo = null;

@Override
public Foo map(ResultSet rs, StatementContext ctx) throws SQLException {
String fooId = rs.getString("f_id");
if (foo == null || !foo.id.equals(fooId)) {
// ideally construct using JDBI's BeanMapper similar to how we can above
// in the RowReducer!
foo = ???
}
// same as above...
Bar bar = ???
foo.addBar(bar);

return foo;
}
}

是否可以在 RowMapper 中轻松使用 BeanMapper,这样我就不必手动构建 bean?

最佳答案

RowMapper<Bar> barMapper = BeanMapper.of(Bar.class)
Bar bar = barMapper.map(rs, ctx);
foo.addBar(bar);

关于java - 在 RowMapper 中使用 BeanMapper?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59830691/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com