从数据库 SQL 查询中创建 Java objects

Creating Java objects from Database SQL query

到目前为止,我从数据库查询中创建简单 POJO 的方式如下:

CallableStatementCallback<Integer> csc = new CallableStatementCallback<Integer>() {
        @Override
        public Integer doInCallableStatement(CallableStatement cs) 
                       throws SQLException, DataAccessException {
            cs.execute();

            ResultSet rs = cs.getResultSet();
            if (rs != null && rs.next()) {
                SomePojoClass spc = new SomePojoClass();

                spc.setFirstValue(rs.getLong("first")); //column names from table
                spc.setSecondValue(rs.getString("second"));
                spc.setThirdValue(rs.getString("third"));

                spcList.add(spc);
              return 1;
            }
          return 0;
        }
    };

显然,这会将每一行映射到一个新的 POJO。但是我有一个 SQL 查询 returns 行是这样的:

 [parent row 1] - [child row 1] (returned as one row obviously)
 [parent row 1] - [child row 2]
 [parent row 2] - [child row 1]
 [parent row 2] - [child row 2]
 [parent row 2] - [child row 3]
 [parent row 3] - [child row 1]

等由于一对多的关系,这是获得 SQL 结果集的非常常见的方式......并且对一个相当简单的结构进行冗余查询似乎是不必要的(并且可能效率低下)。是否有一种既定的简单方法可以将其解析为 java objects?即,我不想遍历结果集 class 并为每一行创建和设置一个新的 object,而是想遍历集合并为每个 parent 创建一个新的 object行和每个 child 行的新 object。

例如,一个想法可能是通过 parent 主键对查询进行排序,然后仅在 parent id 更改时生成一个新的 parent-object,但仍然会生成一个新的 child-object 每行,每当下一行的 parent id 发生变化时,将 parents 和 children 连接在一起。但我不知道这是否是正确的做法。

This is pretty common way of getting a SQL result set because of one to many relations... and doing redundant queries for a fairly simple structure seems unnecessary (and potentially inefficient).

我同意。在这种情况下,您将不得不执行 n 个额外的查询,一个用于父查询结果中的每一行,以获取子记录。或者使用带有父 ID 的 in 子句一次 select 所有子记录,然后以某种方式将它们映射回父记录。怎么切都丑

Is there an established easy way of parsing this into java objects?

有对象关系映射框架可以为您延迟加载子对象。这很有帮助,因为除非从父对象明确请求收集子对象,否则不会执行其他查询。然而,它并没有完全克服上述的低效率问题。尤其是当您知道每个父对象都将使用子对象时。

由于您是直接使用 JDBC 滚动您自己的对象关系映射,因此没有关于如何实现您的目标的既定标准。

For example one idea could be to order the query by parent primary key, then generate a new parent-object only when the parent id changed, but still make a new child-object for each row, and tie the parents and children together whenever the parent id of the next row would change. But I don't know if this is the right way to do it.

你描述的解决方案是我所知道的最好的方法。我用了好几次,觉得效果不错。

以上面的代码示例为模板,您必须填充 POJO 中的所有父属性和子属性,然后在代码中的更高级别检测它是否与前一个相同的父属性并采取相应行动。这对我来说似乎不太优雅,但它可以工作。

希望您能想出一种直接的方法来修改您的设计以更好地支持该算法。如果你愿意,我可以与你分享我自己开发的框架,这样你就可以看到我是如何做到的。