5

から値を取得して、ResultSetリフレクションを介してコンストラクターを呼び出す必要があります。Class.cast(Object) を試していましたが、常に .cast(Object) を取得しInvalidCastExceptionます。

これは私が持っているものです:

    Object[] args = new Object[count];
    Class<?>[] arr = co.getParameterTypes(); 
    for(i = 0; i<args.length; i++){

        args[i] = arr[i].cast(rs.getObject(i+1));
    }

    Object t;

    try {
        t = co.newInstance(args);
    } catch (Exception e) {
        throw new RuntimeException(e); 
    }

    return (T)t;

co はコンストラクターで、rs はResultSet既に持っているコンストラクターです。

4

1 に答える 1

1

ResultSetこれを機能させることができたとしても、オブジェクトのコンストラクターの引数の順序が(RDB のテーブル)の列の順序と一致しない可能性があるという長期的なメンテナンスの悪夢があります。たとえば、Personオブジェクトに firstName、lastName を取るコンストラクタがある場合、DB テーブル内の列の順序が一致しない場合があります。LAST_NAME、FIRST_NAME、または FIRST_NAME、SOME_COLUMN_YOU_DONT_CARE_ABOUT、LAST_NAME の場合もあります。

この問題をより一般的に処理するために私が見たコードでは、ドメイン オブジェクト (たとえば Person) にリフレクションを使用してプロパティ名を取得し (私の場合、コンストラクターではなく YMMV を調べた)、それらを一致させようとします。を使用したResultSet列名ResultSet.getMetaData()

于 2013-06-29T18:57:13.833 に答える