我可以从 JDBI 取回字段的子集吗?

Can I get back subsets of fields from JDBI?

我需要从特定 table 获取最新的几个不同值,我是这样做的:

@SqlQuery("SELECT DISTINCT object_id, MAX(created) FROM my_table WHERE user_id= :userId AND type= :type GROUP BY object_id ORDER BY MAX(created) DESC, object_id LIMIT :count")
??? getLatestDistinctObjects(@Bind("userId") long userId, @Bind("type") int type, @Bind("count") int count);

查询工作正常,但我无法确定 return 类型应该是什么。如果我 returning 一个列没问题(我得到 List<int>,但我不能在此处排除 MAX(created) 以使查询正常工作。return 类型应该我用?

我已经尝试 returning Object 并检查结果,但它只是 returns null.

JDBI 中的默认映射器将使用反射构造对象并使用 setter 方法设置字段。当您使用 Object 作为 return 类型时,结果集中的字段不会有任何 setter。

理想情况下,我们应该有一些代表结果集的对象。如果您不想仅为此查询编写样板代码,我认为下一个最佳选择是 Map,您可以在其中包含键值对。

@SqlQuery(....)
@Mapper(MapMapper.class)
public Map getLatestDistinctObjects(params ...);

但是构建Map需要定义mapper。您可以通用地编写此映射器,以便您可以将其用于任何地图和其他用例。拥有通用映射器的一种方法可能是,

public class MapMapper implements ResultSetMapper<Map<String, Integer>> {
@Override
public Map<String, Integer> map(int index, ResultSet r, StatementContext ctx) throws SQLException {
    HashMap<String, Integer> result = new HashMap<>();
    for(int i =1; i <= r.getMetaData().getColumnCount(); i++) {
        String columnName = r.getMetaData().getColumnName(i);
        Integer value = r.getInt(i);
        result.put(columnName, value);
    }
    return result;
  }
}