【问题标题】:Spring Batch : Database to XML issueSpring Batch:数据库到 XML 问题
【发布时间】:2013-05-15 14:00:33
【问题描述】:

我有一个简单的 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 和 String 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

感谢阅读!

【问题讨论】:

    标签: xml spring spring-batch xstream


    【解决方案1】:

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

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

    [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 获取此字符串:蓝色、黄色、红色并提取每种颜色以将其添加到您的域对象颜色列表中。

    祝你好运

    【讨论】:

      猜你喜欢
      • 2020-12-13
      • 2020-03-02
      • 2019-10-20
      • 1970-01-01
      • 2020-04-14
      • 2023-03-15
      • 2019-11-03
      • 1970-01-01
      • 2021-07-09
      相关资源
      最近更新 更多