子spring对象和它的超级java.util对象之间的显式类型转换

在spring我使用的是jdbcTemplate,但是在查询List时遇到了返回Linkedcaseinsensitivemap的问题,在执行以下操作时我仍然得到spring linkedcaseinsensitivemap,即使我将它转换为java util List并定义左侧作为java.util.List的赋值。

首先,这怎么可能?

final java.util.List<Map> list = (java.util.List<Map>) jdbc .queryForList("SELECT * FROM customer"); 

那么,如何实现这种类型的升级呢? 无需声明第二个列表为它分配内存,然后手动将对象放入java.util.List?

由于LinkedCaseInsensitive是java对象的子类,因此我很难弄清楚如何转换为超级对象,即java List。 如何实现这一目标至关重要。

因为目前还没有办法知道哪些经纪人会使用我们的AMQ,目标是严格保持jms对象,所以我无法开始发送弹簧对象,因为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方法返回一个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,则可以使用不同的查询方法 ,该方法允许您指定自定义RowMapper ,以创建您喜欢的java.util.Map实现。 请注意,如果您使用TreeMap,它将按字母顺序对列进行排序,如果您使用HashMap,它将按随机顺序排列。

接收器然后可以将JSON解包回Java对象。 gson.fromGson(json)将返回一个地图列表。

这是我弄清楚如何让子对象成为它的父类而不破坏方法的唯一方法 – 在我描述的场景中执行以下操作:

 final java.util.ArrayList> javaList = new java.util.ArrayList>(); final java.util.List> list = jdbc .queryForList("SELECT * FROM customer"); javaList.addAll(list); 

但是对我来说看起来并不好,怎么会以更正确的方式实现这个目标呢?