2017-12-05 4 views
0

以下のようなマッピングファイルを書きました。mybatis <id>タグ<resultMap>の動作

<resultMap id="fooResultMap" type="Foo" > 
    <result column="NAME" property="name" jdbcType="VARCHAR" /> 
    <association property="bar" resultMap="barResultMap" /> 
</resultMap> 

私は、同じ名前のcolmun値、MyBatisのリターンのみ1のFooオブジェクトの2レコードを取得。 バーの列が異なるため、2つのFooオブジェクトが必要です。

したがって、私は以下の回避策を講じています。

<resultMap id="fooResultMap" type="Foo" > 
    <id column="dummy_column_for_unique" /> 
    <result column="NAME" property="name" jdbcType="VARCHAR" /> 
    <association property="bar" resultMap="barResultMap" /> 
</resultMap> 

Iは<このresultMap >と "dummy_column_for_unique" 欄に<ID>タグを追加して(存在しない)ダミーです。 2つのFooオブジェクトが見つかりました。

ダミー列の結果がnullで、mybatisがおそらくnull値を別のレコードとして処理するとします。 しかし、このような動作は、私が検索したインターネット上のマニュアルや他のリソースでは説明されていません。

この現象に関する情報はありますか?

答えて

0

MyBatisはIDを使用してオブジェクトをマップします。 ResultMapにIDがない場合、それらはすべて同じオブジェクトにマップされます。 テーブルにプライマリキーが必要ですが、偽のIDを作成すると回避策として役立つかもしれません。

+0

ご返信ありがとうございます。 実際には、私の遭遇したsqlsは、他の人と複合体によって書かれたものです(結合、グループ化、組合...)、 なので、どの列がユニークであるかを特定するのは難しいようです.... #あなたが言うように。 –

1

mybatisのメーリングリストでは、行番号を使用することをお勧めしました。 https://groups.google.com/forum/#!topic/mybatis-user/FAvrJ4piYlU

私の最終的な結果マップは以下のようになります。

<resultMap id="fooResultMap" type="Foo" > 
    <id column="rownum" /> 
    <result column="NAME" property="name" jdbcType="VARCHAR" /> 
    <association property="bar" resultMap="barResultMap" /> 
</resultMap> 

およびSQLは、以下のようなものである(元のSQLは、元のSQLを変更しないため外部SELECT文によってwraped、このSQL文法は、MySQLのためです)。

select @rownum:[email protected]+1 as rownum, org.* from (
### original sql ### 
) org, (select @rownum:=0) r 

私はこれが誰かを助けることを望みます。