2

SpringFrameworkでMVCWebアプリケーションを作成していますが、ApacheDBUtils結果セットの行をネストされたオブジェクトで構成されるJavaBeansに変換する必要があります。

非常に少数の例に関して、私はこのRowProcessor実装を作成したことがわかりました。

public class MonthOrderCountHandler extends BasicRowProcessor {

    @Override
    public Object toBean(ResultSet rs, Class type) throws SQLException {

        // Year
        Year year = new Year();
        year.setYearNo(rs.getInt("yearNo"));
        year.setYear4(rs.getString("year4"));
        year.setYear2(rs.getString("year2"));

        // Quarter
        Quarter quarter = new Quarter();
        quarter.setQuarter(rs.getInt("quarter"));

        // Month
        Month m = new Month();
        m.setYear(year);
        m.setQuarter(quarter);
        m.setMonthAbbreviation(rs.getString("monthAbbreviation"));
        m.setMonthName(rs.getString("monthName"));
        m.setMonthNo(rs.getInt("monthNo"));

        // Final bean
        MonthOrderCount result = new MonthOrderCount();
        result.setMonth(m);
        result.setOrderCount(rs.getInt("orderCount"));

        return result;

    }
}

質問: DAOオブジェクトでこの行プロセッサを使用する方法と、この実装が正しいかどうかを知りたいですか?


通常、私は次の方法で行をJavaBeansに変換します。

ResultSetHandler<List<MonthOrderCount>> listUrlHandler = new BeanListHandler<>(MonthOrderCount.class);

しかし、私の状況では、最初にネストされたオブジェクトを作成し、次に最終的なJavaBeanを作成する必要があるため、カスタム行プロセッサーが必要であると想定しています。


私のドメインオブジェクトの構造は次のとおりです。

MonthOrderCountクラス:

public class MonthOrderCount {    
    private Month month;
    private int orderCount;
}

月クラス:

public class Month {
    private Quarter quarter;
    private Year year;
    private int monthNo;
    private String monthName;
    private String monthAbbreviation;
}

クォータークラス:

public class Quarter {
    private int quarter;
    private String abbreviation;
}

年クラス:

public class Year {
    private int yearNo;
    private String year2;
    private String year4;
}

編集:私の結果はこのように見えるので、私は尋ねています。orderCount変数は適切に入力されていますが、すべてのインスタンスで月はnullです。私にとって最も奇妙なことは何ですか-toBean()メソッドが呼び出されることはありません。

2013-03-10 17:09:46 INFO ChartDataService:29-[MonthOrderCount {month = null、orderCount = 1863}、MonthOrderCount {month = null、orderCount = 2262}、MonthOrderCount {month = null、orderCount = 2531}、MonthOrderCount {month = null、orderCount = 2379}、MonthOrderCount {month = null、orderCount = 2106}、MonthOrderCount {month = null、orderCount = 1498}、MonthOrderCount {month = null、orderCount = 1300}、MonthOrderCount {month = null、orderCount = 1578}、MonthOrderCount {month = null、orderCount = 2385}、MonthOrderCount {month = null、orderCount = 2991}、MonthOrderCount {month = null、orderCount = 2219}、MonthOrderCount {month = null、orderCount = 1943}、MonthOrderCount { month = null、orderCount = 264}]

4

1 に答える 1

6

結果セットをJavaBeansのリストに変換する場合は、toBean()メソッドではなくtoBeanList()をオーバーライドする必要があります。

BasicRowProcessorをオーバーライドした最終ハンドラークラスは次のようになります。

public class MonthOrderCountHandler extends BasicRowProcessor {

    @Override
    public List toBeanList(ResultSet rs, Class clazz) {
        try {
            List newlist = new LinkedList();
            while (rs.next()) {
                newlist.add(toBean(rs, clazz));
            }
            return newlist;
        } catch (SQLException ex) {
            throw new RuntimeException(ex);
        }
    }

    @Override
    public Object toBean(ResultSet rs, Class type) throws SQLException {

        // Year
        Year year = new Year();
        year.setYearNo(rs.getInt("yearNo"));
        year.setYear4(rs.getString("year4"));
        year.setYear2(rs.getString("year2"));

        // Quarter
        Quarter quarter = new Quarter();
        quarter.setQuarterNo(rs.getInt("quarterNo"));

        // Month
        Month m = new Month();
        m.setYear(year);
        m.setQuarter(quarter);
        m.setMonthAbbreviation(rs.getString("monthAbbreviation"));
        m.setMonthName(rs.getString("monthName"));
        m.setMonthNo(rs.getInt("monthNo"));

        // Final bean
        MonthOrderCount result = new MonthOrderCount();
        result.setMonth(m);
        result.setOrderCount(rs.getInt("orderCount"));

        return result;

    }
}

私はそれが誰かを助けることを願っています。

于 2013-03-11T11:04:59.980 に答える