想象一个场景,我正在查询用户列表的订单表,并试图找到他们的订单。我试图得到一个地图,与用户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 ...
}
}