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

您看到的问题是 MyBatis 3 中的一个错误,直到版本 3.0.6: http ://code.google.com/p/mybatis/issues/detail?id=303 。

发布后,您会得到我在另一个答案中概述的答案(使用 MyBatis 3.1.1 完成)。

您有四个选择:

  1. 忽略它,只抓取大写或小写条目
  2. 升级到至少 3.0.6
  3. 停止使用 map 作为 resultType 并移动到 POJO 域对象
  4. 使用以下解决方法:

MyBatis < 3.0.6 的解决方法

使用完整的大写列别名,它们只会在您的地图中显示一次(以大写形式):

<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 尝试了一个稍微简化的查询版本,它工作得很好——这意味着我只在结果映射中取回了一个列名条目。我在下面提供了我的设置,因此您可以尝试重现它或诊断您的代码可能出错的地方。

首先,您的选择语句中有错误。你有

SELECT planId

但是你有:

WHERE ... plan_id = #{plan_id}

所以你可能是指SELECT plan_id在 SELECT 子句中。

这对我有用。

我稍微简化的 MyBatis 选择映射是:

<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 回答