Tengo un objeto JSON que inserto en mi base de datos MySQL.

ps = con.prepareStatement("INSERT INTO tableA(a, b, c, d_json)" +
                    " VALUES(?,?,?,cast(? AS JSON))", Statement.RETURN_GENERATED_KEYS);
// some code
ps.setObject(4, jsonValue);

Inserto un hashmap de cadena como:

    Map<String, String> map = new HashMap<String, String>();
    map.put("key", "value");
    map.put("key1", "value1");
    map.put("key2", "value2");

Sin embargo, el json se codifica de la siguiente manera:

''.

Me gustaría insertar una cadena en lugar de esto. Vi algunas publicaciones en S.O pero no encontré ninguna forma adecuada de solucionarlo. Cualquier ayuda sería apreciada. Gracias !

1
Sox - 26 feb. 2020 a las 17:54

2 respuestas

La mejor respuesta

No puede escribir directamente un objeto Java en MySQL; debe convertir su mapa a una cadena JSON antes de escribirlo en la columna de la tabla. Según los docs: " Intentar insertar un valor en una columna JSON tiene éxito si el valor es un valor JSON válido, pero falla si no lo es ".

Aquí hay un ejemplo (Jackson):

import com.fasterxml.jackson.databind.ObjectMapper;

public class Test {

  private static final ObjectMapper objectMapper = new ObjectMapper();

  public static String toJSON(Map<String, String> map) throws JsonProcessingException {
    return objectMapper.writeValueAsString(map);
  }
}

Otra opción sería crear una columna adicional, e , y luego simplemente escribir el mapa en dos columnas: map(k,v) => d(k), e(v)

1
Piotr Niewinski 10 mar. 2020 a las 10:29

El controlador Java Mysql no admite la conversión automática de Hashmaps. De hecho, si utiliza un tipo desconocido en setObject, utilizará la serialización Java predeterminada para convertirlo en algo que pueda manejar. La base de datos recibe una matriz de bytes que contiene el HashMap serializado. cast(? as JSON) convierte eso en algo que se puede almacenar en la columna, que es la matriz de bytes codificada BASE64.

Debe convertir su HashMap a una cadena JSON en su código Java antes de enviarlo a la base de datos.

1
Markus Heberling 3 mar. 2020 a las 11:47