1

我有一个简单的 spring 批处理程序,它从数据库表中读取并使用下面的默认 XStreamMarshaller 编写器类形成输出 XML

org.springframework.oxm.xstream.XStreamMarshaller 

我从中读取输入的数据库表 TOY 包含两列:TOY_NAME、TOY_COLOR

对于单个玩具,可能有多个不同颜色的条目。

例如对于 TOY CAR 和 TOY BUS,数据库条目如下:

TOY_NAME   |    TOY_COLOR
--------------------------
 CAR       |    RED
 CAR       |    YELLOW
 CAR       |    BLUE
 BUS       |    RED
 BUS       |    YELLOW
--------------------------

将传递给 ROW MAPPER 的结果集将是 5 行,每行有两列,即。玩具名称和颜色。

我的 java 域对象由一个包含 TOY 对象列表的主要对象 TOYS 组成。

TOY 对象本身包含两个字段,即。toyName 和字符串 toyColor 的列表。

我的输出 XML 具有简单的读写配置如下:

<TOYS>

   <TOY>
       <NAME>CAR</NAME>
       <COLORS>
         <COLOR>RED</COLOR>
       </COLORS>
   </TOY>

   <TOY>
       <NAME>CAR</NAME>
       <COLORS>
         <COLOR>YELLOW</COLOR>
       </COLORS>
   </TOY>

   <TOY>
       <NAME>CAR</NAME>
       <COLORS>
         <COLOR>BLUE</COLOR>
       </COLORS>
   </TOY>

   <TOY>
       <NAME>BUS</NAME>
       <COLORS>
         <COLOR>RED</COLOR>
       </COLORS>
   </TOY>

   <TOY>
       <NAME>BUS</NAME>
       <COLORS>
         <COLOR>BLUE</COLOR>
       </COLORS>
   </TOY>

</TOYS>

从上面可以清楚地看出,对于结果集的每一行,都会创建一个单独的 TOY 节点。

但是,我希望输出如下:

<TOYS>

   <TOY>
       <NAME>CAR</NAME>
       <COLORS>
         <COLOR>RED</COLOR>
         <COLOR>YELLOW</COLOR>
         <COLOR>BLUE</COLOR>
       </COLORS>
   </TOY>

   <TOY>
       <NAME>BUS</NAME>
       <COLORS>
         <COLOR>RED</COLOR>
         <COLOR>BLUE</COLOR>
       </COLORS>
   </TOY>

 </TOYS>

也就是说 - 对于每个玩具,应该只创建一个包含该特定玩具的所有颜色的玩具节点。

如何根据我拥有的结果集在我的 READER(或 ROW MAPPER)中处理此要求?

有没有办法调整我的阅读器 sql 以满足上述情况?

我当前的 sql(生成第一个 xml)是:

SELECT TOY_NAME, TOY_COLOR FROM TOY ORDER BY TOY_NAME

谢谢阅读!

4

1 回答 1

0

而不是在您的域对象玩具中使用列表,我会尝试使用带有键 = 名称的地图。在您的读者和作者之间,我将实现一个 ItemProcessor 尝试从地图中获取玩具对象并将 addColor() 放入其中,然后将其放回地图中。

所以在你的例子中,你最终会得到

[car,[toy[name=car,colors={blue,red,yellow}]]    
[bus,[toy[name=bus,colors={blue,red}]]

然后 XStream 会写出你需要的输出。(您可能必须使用转换器)

这只适用于一个小的结果集......好吧,一个结果集 samller 然后是你的提交间隔。因为如果您的结果集大于您的提交间隔,您将无法访问您的地图,并且您最终可能会得到多个

<TOY><name="car">

这个合并之王的问题在于,您必须在内存中构建所有 XML 文档,然后再将其刷新到磁盘!

如果我想到更好的东西,我会编辑。

编辑:哦,您还可以使用 GROUP BY 名称并 CONCAT 颜色

这会给你

car | blue,yellow,red
bus | red,blue

然后您可以使用 ItemProcessor 获取此字符串:蓝色、黄色、红色并提取每种颜色以将其添加到您的域对象颜色列表中。

祝你好运

于 2013-05-15T17:58:22.237 回答