【问题标题】:populating bean objects from the resultset从结果集中填充 bean 对象
【发布时间】:2011-01-24 09:34:55
【问题描述】:

我在从结果集中填充 bean 对象时遇到问题。

描述:Resultset 包含一个存储过程的结果,它是 3 个表 BBOBOV 的连接。

我有 3 个 POJO 对应于表。表之间的关系是:B可以有0个或多个BOBO可以有0个或多个BOV。所以完全在结果集中我有 162 条记录,其中包含 B 的重复项。

例如:

B  BO   BOV
1  1     1
1  1     2
1  2     1
2  1     1 

等等。

实际上有 10 个不同的B。所以我只想要结果集中的 10 个B,而不是 162 条记录。此外,对于B=1 的所有BOBOV 的值,II 应该能够得到对应的BOBOV

我该怎么做?这是纯 Java 逻辑,无法更改存储过程的任何内容。只需要处理结果集。

【问题讨论】:

  • 也许只有我……但我认为您需要重新表述您的问题。它真的很混乱。也许发布一个重新调整的结果集的示例。
  • 我已经格式化了。他不知道 Markdown 的功能。

标签: java stored-procedures jdbc resultset


【解决方案1】:

这里有一个结果集的运行图是一个可能的伪代码

[仅限伪代码...不保证编译]

Map mapofBs = new HashMap();
while(rs.hashNext()) {
    rs.next();
    String bId = rs.getString("columnname for id of b");
    B objectB = mapofBs.get(bId);
    if(objectB == null) {
        objectB = new B();
        //read relevant columns from result set and put into objectB
        mapOfBs.put(bId, objectB)
    }   
    //now onto the boId
    String boId = rs.getString("columnname for id of BO");
    BO objectBO = objectB.getBOForId(boId);
    if(objectBO == null) {
        objectBO = new BO();
        //read relevat columns from result set for objectBO
        objectB.addObjectBO(objectBO);
    }
    String bovID = s.getString("columnname for id of BOV");
    BOV objectBOV = objectBO.getBOVForId(bovId);
    if(objectBOV == null) {
        objectBOV = new BOV();
        //read relevat columns from result set for objectBOV
        objectBO.addObjectBOV(objectBOV);
    }
}
//mapOfBs.keySet() gives you a Set<B> which you are interested in

【讨论】:

    【解决方案2】:

    更改查询以包含 GROUP BY 是最好的选择。

    【讨论】:

    • 他说他不能改变存储过程中的任何东西。
    • 我很清楚这一点,但这仍然是最好的答案。一旦产生了基本原理,这样的约束就会神奇地消失,这并不陌生。这里的基本原理是,它在存储过程中微不足道,而且非常高效,而不是让一个显然没有经验的程序员与许多 Java 行搏斗来做同样的事情,谁知道这种方式效率有多低。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-03
    • 2012-06-22
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    相关资源
    最近更新 更多