Java 使用行映射器返回映射<;字符串,Map<;字符串,列表<;对象>&燃气轮机&燃气轮机;

Java 使用行映射器返回映射<;字符串,Map<;字符串,列表<;对象>&燃气轮机&燃气轮机;,java,spring,spring-jdbc,Java,Spring,Spring Jdbc,数据库中的每一行都是这样的 School Class StudentID Name Age 123 8 811 John 10 123 8 812 Smith 11 123 8 821 John 12 123 8 822 Smith 13 123 9 911 John 14 1

数据库中的每一行都是这样的

School  Class   StudentID   Name    Age
123      8        811       John    10
123      8        812       Smith   11
123      8        821       John    12
123      8        822       Smith   13
123      9        911       John    14
123      9        912       Smith   15
456      8        811       John    10
456      8        812       Smith   11
现在我想像这样返回上面的数据

Map<String,Map<String,List<Object>>>

ie. Map<School,Map<Class,List<StudentID>>>
从Java检索结果集实际上需要40分钟

由于DB调用用于填充缓存对象(使用CRON每4小时填充一次),因此我不介意延迟40分钟,因为实际的REST调用将引用缓存对象。但我仍然希望尽可能高效地完成这项工作


另外,请让我知道,如果有任何其他方式,我可以处理这种情况。对于每一个REST调用,一个普通的jdbc调用都是昂贵的,因为我们每秒将收到100个请求。

RowMapper

您可以实现一个状态完整的
RowMapper
来解决您的问题,但它并不真正符合
RowMapper
的思想,后者被认为是无状态的,可以像JavaDoc中所述的那样重用:

。。。RowMapper对象通常是无状态的,因此可以重用

RowMapper
用于行到对象的转换,这意味着结果集的每一行都有自己的对象

ResultSetExtractor

真正适合您任务的是
ResultSetExtractor
ResultSetExtractor
用于按您的意愿将ResultSet转换为对象

只需通过迭代ResultSet实现填充映射,并将
ResultSetExtractor
实现的实例传递给
JdbcTemplate.query(…)
调用


更新2017-02-09

在评论使用
ResultSetExtractor
的示例会很有用时,我偶然发现了
RowCallbackHandler
接口。虽然这两个选项都允许您实现所需的行为,但
RowCallbackHandler
为您处理
ResultSet
迭代。它也可以通过
JdbcTemplate.query(…)
调用使用


对于
RowCallbackHandler
ResultSetExtractor
的示例,我推荐以下文章Ram Satish:

我假设您的每个实体都有一个
DAO
类?为什么不让您的DAO将
列表
转换为
映射
,并将其返回到外部世界?jdbcTemplate调用在DAO内部,我想知道这是否可以使用RowMapper完成。因此,当您使用
jdbcTemplate
执行查询时,您基本上希望它为您形成
映射
?我相信您实现的任何解决方案最终都会在内部将
列表
转换为
映射
,那么为什么不让您的
DAO
来实现呢?是的,这正是我想要的。但是,从JDBCTemplate获得的列表中,有没有一种方法可以做到这一点,或者我应该自己做到这一点?我想应该有一种方法可以做到这一点。但问题是你这么做的动机是什么?谢谢。但是,在我执行jdbc调用之后立即构建我的实际地图是否有效?(性能方面。)我正在使用的
SELECT*fromtable
查询实际上需要40分钟才能完成。如果我想再次构建映射,我必须再次迭代结果集。这就是为什么我认为这种方法有助于提高性能。我今天尝试了ResultsTextRactor,并且能够完成我想要做的事情。您能否添加一个关于ResultsTextRactor如何工作的小实现片段,以便答案对其他人更有用?
SELECT * from TABLENAME