3

mybatis を使用して DB からデータを取得していますが、返されたデータには重複したエントリが含まれています。

必要な結果: 列名、値

期待される結果: column1 value A しかし、返される結果は: COLUMN1 value A , column1 value A.

私の疑問を明確にすることができれば幸いです。

なぜそれが起こっているのか誰か教えてもらえますか?

<select id="getContentMap" resultType="map" parameterType="map">
            select planId,location_qualifier  from disclaimer_disclosure_content where 
            <choose>
                <when test="plan_id != null">
                    plan_id = #{plan_id}
                </when>
                <when test="product_id != null">
                    product_id = #{product_id}
                </when>
                <otherwise>
                    issuer_id = #{issuer_id}
                </otherwise>
            </choose>
             and effective_date >= #{effective_date} 
             and location_qualifier LIKE  CONCAT('%' , #{location_qualifier} , '%') 
        </select>
4

2 に答える 2

5

表示されている問題は、リリース3.0.6までのMyBatis 3のバグです: http ://code.google.com/p/mybatis/issues/detail?id=303 。

そのリリースの後、私が他の回答で概説した回答が得られます(これはMyBatis 3.1.1で行われました)。

4つのオプションがあります。

  1. 無視して、大文字または小文字のエントリのみを取得してください
  2. 少なくとも3.0.6にアップグレードする
  3. resultTypeとしてのマップの使用を停止し、POJOドメインオブジェクトに移動します
  4. 以下の回避策を使用してください。

MyBatis<3.0.6の回避策

完全な大文字の列エイリアスを使用すると、マップに1回だけ(大文字で)表​​示されます。

<select id="getContentMap" resultType="map" parameterType="map">
  select plan_id as PLAN_ID, location_qualifier as LOCATION_QUALIFIER from disclaimer_disclosure_content
  where
  <!-- SNIP: is the same as you had -->
</select>

これにより、次の出力が得られます。

{PLAN_ID=2, LOCATION_QUALIFIER=Bar}

(または、選択したものがどのように見えるかに応じて、同様のもの)。

于 2012-06-13T17:02:59.820 に答える
0

おそらく、次のような詳細情報を報告する必要があります。

  1. どのデータベースを使用していますか?
  2. MyBatis 3 のどのバージョンを使用していますか (またはまだ iBATIS を使用していますか)?
  3. あなたのテーブル構造はどのように見えますか?

いずれにせよ、MySQL 5.1 と MyBatis-3.1.1 を使用してクエリを少し簡略化したバージョンを試してみたところ、問題なく動作しました。つまり、結果マップに列名のエントリが 1 つしか返されませんでした。以下にセットアップを提供しますので、それを再現したり、コードが間違っている可能性がある場所を診断したりできます。

まず、選択ステートメントにエラーがあります。あなたが持っている

SELECT planId

しかし、あなたは持っています:

WHERE ... plan_id = #{plan_id}

したがって、おそらくSELECT plan_idSELECT句で意味していました。

これが私のために働いたものです。

少し簡略化した MyBatis select マッピングは次のとおりです。

<select id="getContentMap" resultType="map" parameterType="map">
  SELECT plan_id, location_qualifier FROM disclaimer_disclosure_content
  WHERE
  <choose>
    <when test="plan_id != null">
      plan_id = #{plan_id}
    </when>
    <otherwise>
     product_id = #{product_id}
    </otherwise>
  </choose>
  AND location_qualifier LIKE CONCAT('%' , #{location_qualifier} , '%')
</select>

次に、このクエリの MySQL テーブル:

mysql> select * from disclaimer_disclosure_content;
+---------+--------------------+------------+
| plan_id | location_qualifier | product_id |
+---------+--------------------+------------+
|       1 | Foo                |        101 |
|       2 | Bar                |        102 |
|       3 | Baz                |        103 |
|       4 | Quux               |        104 |
+---------+--------------------+------------+
4 rows in set (0.01 sec)

第三に、マッピングを使用する私の Java コード:

@Test
public void testForSO() throws Exception {
  Map<String, Object> paramMap = new HashMap<String, Object>();
  paramMap.put("plan_id", 2);
  paramMap.put("location_qualifier", "Ba");

  List<Map<String,Object>> lmap = session.selectList("getContentMap", paramMap);
  assertNotNull(lmap);
  Map<String,Object> m = lmap.get(0);
  assertNotNull(m);
  System.out.println(m.toString());
}

これは合格して出力されます:

{location_qualifier=Bar, plan_id=2}

私もそれを試しました

Map<String,Object> m = session.selectOne("getContentMap", paramMap);

同じ期待される結果が得られます。

于 2012-06-12T23:03:03.303 に答える