0

モデル マッパーを JDBI で使用していますが、モデル マッパーを SQL オブジェクト クエリで使用できません。

たとえば、私はこの選択をしています

@SqlQuery("select * from example")

ドキュメントには、結果をマップするには ResultSetMapper または ResultSetMapperFactory を使用する必要があると書かれています。モデルマッパーを使用するマッパーを書きたいのですが、できるかどうかを理解するのに問題があります (以下のコードは機能しません)。ExampleMapper クラスのメソッドは次のとおりです (SqlObject で使用されるアノテーションは です @RegisterMapper(ExampleMapper.class) )

public ExamplePO map(int index, ResultSet r, StatementContext ctx) throws SQLException{
    System.out.println("rs: " +  r.getString("id_Example"));
    ModelMapper mapper = new ModelMapper();
    mapper.getConfiguration().setSourceNameTokenizer(NameTokenizers.UNDERSCORE);
    return mapper.map(r, ExamplePO.class);
}

モデルマッパーを使用してresultSetをマップするにはどうすればよいですか? ありがとう、シルビア

4

1 に答える 1

1

問題は、modelmapper の「map」メソッドが結果セット内のすべてのレコードを 1 回の呼び出しで処理するのに対し、jdbi の「map」関数は「map」メソッドが一度に 1 つの結果行を処理することを想定していることです。結果として、モデルマッパーは最初に呼び出されたときに、結果セット内のすべてのレコードを貪欲に読み取ります。これにより、結果セットがモデルマッパーに返されるときにすでに閉じられているため、jdbi はエラーをスローします。

ただし、これは 2 つのステップで簡単に実行できます。これはそれほどきちんとしたものではありませんが、jdbi または modelmapper のコードをいじるよりははるかに簡単です。最終的な結果は、私が望んでいたものです。マッピングを行うためにフィールド名を手動で入力することなく、データベースから Java に移動する非常に簡単な方法です。

最初のステップは、マップのリストを返す SQL オブジェクト API インターフェイス宣言でデフォルト マッパーを使用することです。

@SqlQuery("select product_id, title from product where product_id = :id ")
@Mapper(DefaultMapper.class)
public List<Map<String, Object>> getProductDetails(@Bind("id") long id);

ModelMapper はマップのリストに非常に満足しているため、コードの他の場所でモデル マッパーを使用して結果を必要な型に変換します。このために、JDBI Sql オブジェクト インターフェイスに実際の DAO をラップして、jdbi インターフェイスを非表示にしました。変換自体は、Bean/pojos のリストへの変換に再利用できる汎用メソッドを使用して実行できます。

public static <T> List<T> map(Class<T> clazz, List<Map<String, Object>> data) {

    ModelMapper modelMapper = new ModelMapper();
    modelMapper.getConfiguration().setSourceNameTokenizer(NameTokenizers.UNDERSCORE);
    List<T> result = modelMapper.map(data, new TypeToken<List<T>>() {}.getType());
    return result;
}

public List<Product> getProductDetails(long id) {
    return ListMapper.map(Product.class, productDBI.getProductDetails(id));
}
于 2015-12-24T17:13:59.387 に答える