mybatis devuelve el mapa de resultados con entrada duplicada

Estoy usando mybatis para recuperar datos de DB, los datos devueltos contienen entradas duplicadas.

Resultado requerido: Nombre de columna, Valor

El resultado esperado es: columna1 valor A Pero el resultado devuelto es: COLUMNA1 valor A, columna1 valor A.

Espero poder aclarar mi duda.

¿Alguien puede decirme por qué está sucediendo?

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

preguntado el 12 de junio de 12 a las 08:06

¿Puede publicar su estructura de tabla y consulta? -

2 Respuestas

El problema que estás viendo es un error en MyBatis 3 hasta la versión 3.0.6: http://code.google.com/p/mybatis/issues/detail?id=303.

Después de ese lanzamiento, obtienes la respuesta que describí en mi otra respuesta (que se hizo con MyBatis 3.1.1).

Tienes cuatro opciones:

  1. Simplemente ignórelo y solo tome las entradas en mayúsculas o minúsculas
  2. Actualizar a al menos 3.0.6
  3. Deje de usar el mapa como tipo de resultado y muévase a un objeto de dominio POJO
  4. Utilice la solución a continuación:

solución para MyBatis < 3.0.6

Use alias de columnas en mayúsculas completas y solo aparecerán una vez (en mayúsculas) en su mapa:

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

Esto da como resultado la salida:

{PLAN_ID=2, LOCATION_QUALIFIER=Bar}

(o algo similar dependiendo exactamente de cómo se vea su selección).

Respondido el 13 de junio de 12 a las 18:06

Probablemente necesitará reportar más información, como:

  1. ¿Qué base de datos estas usando?
  2. ¿Qué versión de MyBatis 3 estás usando (o sigues usando iBATIS)?
  3. ¿Cómo es la estructura de tu mesa?

En cualquier caso, probé una versión ligeramente simplificada de su consulta usando MySQL 5.1 y MyBatis-3.1.1 y funcionó bien, lo que significa que solo obtuve una entrada del nombre de la columna en el mapa de resultados. Proporciono mi configuración a continuación para que pueda intentar reproducirla o diagnosticar dónde puede estar mal su código.

Primero, tiene un error en su declaración de selección. Tienes

SELECT planId

pero luego tienes:

WHERE ... plan_id = #{plan_id}

así que probablemente quisiste decir SELECT plan_id en la cláusula SELECT.

Esto es lo que funcionó para mí.

Mi mapeo de selección MyBatis ligeramente simplificado es:

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

En segundo lugar, mi tabla MySQL para esta consulta:

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)

Tercero, mi código Java para usar el mapeo:

@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());
}

Esto pasa e imprime:

{location_qualifier=Bar, plan_id=2}

También lo probé con

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

y obtener el mismo resultado esperado.

Respondido el 13 de junio de 12 a las 00:06

usamos mybatis versión 3.0, mysql como db 5.1.12. - zuned ahmed

está bien. Investigué un poco sobre las versiones anteriores de MyBatis; este es un error en las versiones anteriores de Mybatis. Vea mi nueva respuesta para obtener detalles y una solución alternativa. - quux00

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.