我可以从 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;
}
}
我需要从特定 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;
}
}