如何将结果集映射到对象的嵌套结构?

Posted

技术标签:

【中文标题】如何将结果集映射到对象的嵌套结构?【英文标题】:How do I map a resultset to a nested structure of objects? 【发布时间】:2013-06-17 13:22:51 【问题描述】:

我有一个这样的结果集......

+--------------+--------------+----------+--------+
| LocationCode | MaterialCode | ItemCode | Vendor |
+--------------+--------------+----------+--------+
|            1 |           11 |      111 |   1111 |
|            1 |           11 |      111 |   1112 |
|            1 |           11 |      112 |   1121 |
|            1 |           12 |      121 |   1211 |
+--------------+--------------+----------+--------+

LocationCode 2,3,4 等等。我需要一个对象(最终转换为 json)为:List<Location> 位置类中嵌套对象的层次结构在哪里..

Location.class
    LocationCode
    List<Material>

Material.class
    MaterialCode
    List<Item>

Item.class
    ItemCode
    Vendor

这对应于结果集,其中 1 个位置有 2 个材料,1 个材料(11)有 2 个项目,1 个项目(111)有 2 个供应商。

我如何做到这一点?我以前使用过AliasToBeanResultTransformer,但我怀疑在这种情况下它会有所帮助。

【问题讨论】:

请向我们展示您已经尝试过的代码 我不认为这些是 Java 使用该术语的意义上的“嵌套类”。或者至少,它们不需要是嵌套类。 @Marco :我被困在一个水平,我不知道如何从这里开始,或者使用什么方法。到目前为止,我只有创建 Query 对象和 query.list() 的代码。 @Stephen:同意。已编辑。 【参考方案1】:

我认为没有一种巧妙的方法来进行映射。我只需使用嵌套循环和自定义逻辑来决定何时开始构建下一个位置、材质、项目等。

类似这样的伪代码:

while (row = resultSet.next()) 
    if (row.locationCode != currentLocation.locationCode) 
        currentLocation = new Location(row.locationCode)
        list.add(currentLocation)
        currentMaterial = null
     else if (currentMaterial == null ||
               row.materialCode != currentMaterial.materialCode) 
        currentMaterial = new Material(row.materialCode)
        currentLocation.add(currentMaterial)
     else 
        currentMaterial.add(new Item(row.itemCode, row.vendorCode))
    

【讨论】:

以上是关于如何将结果集映射到对象的嵌套结构?的主要内容,如果未能解决你的问题,请参考以下文章

resultMap高级映射

将 simplejdbccall 结果集转换为 java 对象

精通Mybatis之结果集处理流程与映射体系(联合查询与嵌套映射)

如何将本机查询的结果集映射到实体中的变量

如何将 DBUtils 结果集转换为由更多域对象组合而成的 JavaBeans?

mybatis一个结果集不能用两次吗