3

これは私の下手な英語を使用した最初の投稿です...

MyBatis3.0を使用しています

クエリでは、次のようなメソッドで SqlBuilder を使用しました。

public class DataStatisticSqlBuilder extends SqlBuilder{ 

public String getDataQtyListSql(Map<String, Object> map){

次のようなマッパーインターフェース:

public interface DataStatisticMapper {

@SelectProvider(type=DataStatisticSqlBuilder.class, method="getDataQtyListSql")

public List<Map<String, Object>> getDataQtyList(@Param("groups")
List<DataStatisticSqlBuilder.Group> groups, @Param("quatity") Integer quatity, @Param("struct") Struct struct); 
}

私が電話したとき

session.getMapper(DataStatisticMapper.class).getDataQtyList(...some parameters)

コンソールに次の結果出力が表示されました。

<==    Columns: PROJECT, PRJ_COUNT, TAR_COUNT, SITE_COUNT, PARAM_COUNT
<==        Row: project A, 1, 1, 0, 0 
<==        Row: project B, 1, 1, 0, 0

上記の出力に基づいて、期待される結果はリスト [Map, Map, ...] になるはずですが、実際の結果は [null, null] です。結果が HashMap にマップされていないようです。このクエリで結果タイプを HashMap に設定するにはどうすればよいですか?

いくつかの注釈を使用するかもしれませんが、見つかりませんでした。

どうもありがとう。

4

1 に答える 1

4

動的に生成されたSQLを処理しようとして、同じ[null、null]を取得しました。mybatis のマニュアルには SqlBuilder について言及されていますが、SQL の使用方法は提案されていません。@Results および @Result アノテーションを追加することで問題を解決できると思います。結果列が常に同じである場合、これは機能するはずです。たとえば、@Results の例の最後を参照してください。

私の使用では、どの列があるのか​​ わからないので、最終的に行ったのは次のとおりです。

私のマッパーxmlファイルでは:

  <update id="executeUpdate">
    ${stmt}
  </update>

  <select id="executeQuery" resultType="java.util.Map">
    ${stmt}
  </select>

#{} の代わりに ${} は、文字列をそのまま挿入し、jdbc として扱いませんか? パラメータ。それがこのソリューションの鍵です。あなたの場合、これは @SelectProvider によって返される sql であり、実行する実際の sql を渡すために @Param("stmt") を追加します。

xml ファイルに対応する mybatis インターフェイスで:

void executeUpdate(DynamicSqlDao.ParameterObject po);
List<Map<String,Object>> executeQuery(DynamicSqlDao.ParameterObject po);

ParameterObject は単純な Bean です。

@Data
public class ParameterObject
{
    String stmt;
    Map<String,Object> param;
}

(@Data はProject Lombokからのもので、getter/setter を生成します)

次のように、インターフェイスを「dao」と呼ぶことができます。

Map<String,Object> pmap = new HashMap<String,Object>();
pmap.put("apa", "banan");
ParameterObject po = new ParameterObject();
po.stmt = stmt;
po.param = pmap;
List<Map<String,Object>> result = dao.executeQuery(po);

ParameterObject は、SQL ステートメント用に予約された名前を持つ単なる Map である可能性があります。これを投稿したので、他の誰かがよりエレガントなソリューションを投稿できますか... :)

于 2011-09-25T17:26:12.773 に答える