在春天我使用的是jdbcTemplate,但是在查询List时遇到了返回Linkedcaseinsensitivemap的问题,在执行以下操作时我仍然得到spring linkedcaseinsensitivemap,即使我将它转换为java util List并定义左侧的作为java.util.List的赋值.
首先,这怎么可能?
final java.util.List<Map<String, Object>> list = (java.util.List<Map<String, Object>>) jdbc
.queryForList("SELECT * FROM customer");
那么,怎么会做这种类型的升级呢?
无需声明第二个列表为它分配内存,然后手动将对象放入java.util.List?
由于LinkedCaseInsensitive是java对象的子类,因此我很难弄清楚如何转换为超级对象,即java List.如何实现这一目标至关重要.
因为目前无法知道哪些经纪人将使用我们的AMQ,目标是严格保持jms对象,
所以我无法开始发送spring对象,因为jms应该是我们的标准,还请注意我没有选项来实现AMQProtocol,我需要发送基本的java对象,
由于已建议序列化为JSON,我将解释为什么它在这种情况下不起作用,为什么我需要将“按原样”发送给接收器,因为它们将把它放入Notes文档中.
for (int i = 1; i <= metadata.getColumnCount(); i++) {
String columnName = metadata.getColumnName(i);
Object values = sqlConnection.getRset().getObject(i);
doc.replaceItemValue(columnName, values);
}
那么,人们如何更好地实现这一目标呢?
请帮忙
提前致谢!
解决方法:
SQL select可以返回多行,每行有多个选定的列.
您正在调用的queryForList method返回一个List,其中每个选定的行都将Map映射列名称更改为列值.
Map和List是接口,因此Spring可以*选择它喜欢的任何实现.它为Map选择LinkedCaseInsensitiveHashMap,因为该映射将按插入顺序列出键.因此,选择列的顺序不会丢失.
如果您希望将结果列表发送给您几乎不了解的接收器,则最好将其序列化为JSON并将其作为文本消息发送.
您可以使用像Gson或Jackson2这样的库序列化为JSON.您可以创建一个序列化程序并将其转换为您希望转换为String的对象.
例如在Gson中,序列化器类被称为Gson:
TextMessage message;
// initialize message and headers however you like
// then serialize it to String:
Gson gson = new Gson();
String json = gson.toJson(list);
// and set it in the message:
message.setText(json);
(您也可以让Spring JmsTemplate使用转换为JSON的MessageConverter为您执行此操作,但我估计这样做有点困难.)
或者,如果您希望自定义作为ObjectMessage发送的Map,则可以使用a different query method,它允许您指定自定义RowMapper,以创建您喜欢的java.util.Map实现.请注意,如果您使用TreeMap,它将按字母顺序对列进行排序,如果您使用HashMap,它将按随机顺序排列.
接收器然后可以将JSON解包回Java对象. gson.fromGson(json)将返回一个地图列表.