将jdbc查询结果映射到具有值列表的列上的键值映射



想象一个场景,我正在查询用户列表的订单表,并试图找到他们的订单。我试图得到一个地图,与用户id的键集,和订单对象的列表。返回类型与此类似- Map<Integer,>

JdbiHelper.jdbi(readOnly).withHandle(
handle -> handle.createQuery(query)
.bindList("user_id", userIds).?

查询本身就像:-

SELECT * FROM orders WHERE user_id in (<userIds>)

我如何得到一个映射,键作为用户id和列表的顺序对象的值?

我正试着做这些

JdbiHelper.jdbi(readOnly).withHandle(
handle -> handle.createQuery(query)
.bindList("user_id", userIds)
.map((rs, ctx) -> Pair.of(rs.getInt("user_id"), rs))
.collect(toMap(Pair::getLeft, Pair::getRight))

但是,它没有工作。

你需要一个结果映射器,例如一个OrderMapper,它将结果集转换成一个Order对象。

这是一个使用Guava immutableelistmultimap(映射到一个列表或结果)的解决方案。否则,您必须编写自己的Collector,将生成的Order对象收集到Map<Integer, List<Order>>中。

OrderMapper mapper = new OrderMapper();
Multimap<Integer, Order> results = JdbiHelper.jdbi(readOnly).withHandle(
handle -> handle.createQuery("SELECT * from orders WHERE user_id IN (<user_id>)")
.bindList("user_id", userIds)
.mapTo(Order.class)
.collect(toImmutableListMultimap(Order::getUserId, Functions.identity())));

或者您可以使用Jdbi.registerColumnMapper(new OrderMapper())向jdbc注册OrderMapper,并使用.mapTo(Order.class)而不是.map(mapper)

在任何情况下,您都需要一个映射器来将结果集转换为Order对象。

public class OrderMapper implements ColumnMapper<Order> {
public Order map(ResultSet r, int columnNumber, StatementContext ctx) throws SQLException {
return new Order().setUserId(rs.getInt("user_id"),
... additional columns ...
}
}

最新更新