4

問題

17 レコードを返すクエリがあります。を持つマップで MyBatis を使用すると、<association>6 つのレコードが返されます。これは私の他のマップでは起こらないことに注意してください。すべて正常に機能する関連を持つ他の多くのマップがあります。

クエリ:

    with leave_counts as 
    (
        select leave_type_id, count(llm.leave_id) as count
        from lw_leave_master llm
        group by leave_type_id
    )
    select llt.leave_type_id, llt.leave_type_abbr_tx, 
            llt.leave_type_desc_tx, lc.count as count_nm
    from lw_leave_type llt
        join leave_counts lc on lc.leave_type_id=llt.leave_type_id
    order by llt.leave_type_abbr_tx

地図:

<resultMap id="typeCountMap" type="mypackage.myclass">
    <result property="count" column="count_nm"/>
    <association property="type" resultMap="package.myMap"/>
</resultMap>


<resultMap id="myMap" type="mypackage.myclass2">
    <result property="id" column="leave_type_id"/>
    <result property="abbr" column="leave_type_abbr_tx"/>
    <result property="description" column="leave_type_desc_tx"/>
</resultMap>

<association>inはtypeCountMap地図を指しますmyMap

これにより、毎回 6 つのレコードが返されます。ロガーから実行された実際のクエリを取得して手動で実行すると、17 レコードが返されます。

ソリューション?

MyBatis が 17 レコードすべてを返すようにするためにできることは 2 つあります。

#1

クエリからを削除すると、lc.count as count_nm17 件すべてのレコードが返されます (値が関連付けられていないだけです)。

    with leave_counts as 
    (
        select leave_type_id, count(llm.leave_id) as count
        from lw_leave_master llm
        group by leave_type_id
    )
    select llt.leave_type_id, llt.leave_type_abbr_tx, 
            llt.leave_type_desc_tx
    from lw_leave_type llt
        join leave_counts lc on lc.leave_type_id=llt.leave_type_id
    order by llt.leave_type_abbr_tx

これは明らかに良い解決策ではありませんが、私が間違っていることを理解するのに役立つ場合に備えて、これを含めたいと思いました.

#2

関連付けを他のマップのコンテンツに置き換えると、すべてが期待どおりに機能します。

<resultMap id="typeCountMap" type="mypackage.myclass1">
    <result property="count" column="count_nm"/>        
    <result property="type.id" column="leave_type_id"/>
    <result property="type.abbr" column="leave_type_abbr_tx"/>
    <result property="type.description" column="leave_type_desc_tx"/>
</resultMap>

これは明らかに、別の解決策が見つからない場合に行うことです。これは機能するためです。<association>私が他のマップで持っているのと同じように使うのはいいことです。

MyBatis 3.1.1 を使用していることに注意してください。

4

4 に答える 4

3

3.1.1 を使用している場合は、プロパティ属性なしで <id column="leave_type_id" /> のみを定義できます 3.1.1 を
使用していない場合は、 <result property="abbr" column="leave_type_id" /> を追加できます関連付けのためにキャッシュキー計算にフィールドを含めるリストの一番上に、後で再定義すると正しい値が割り当てられます

于 2014-03-06T17:22:46.053 に答える
1

これが問題かどうかはわかりませんが、試してみてください。コメントを残すのに十分な担当者がいないため、ここに投稿する必要があります。

アソシエーションに列属性を追加し、2 番目のマップで ID 列をマークしてみてください。

<resultMap id="typeCountMap" type="mypackage.myclass">
    <result property="count" column="count_nm"/>
    <association property="type" column="leave_type_id" resultMap="package.myMap"/>
</resultMap>

<resultMap id="myMap" type="mypackage.myclass2">
    <id property="id" column="leave_type_id"/>
    <result property="abbr" column="leave_type_abbr_tx"/>
    <result property="description" column="leave_type_desc_tx"/>
</resultMap>
于 2013-05-13T15:52:12.917 に答える