@Override
    public String asString() {
        Map<?, ?> value = getValue();
        if (value == null || value.isEmpty()) {
            return ClickHouseValues.EMPTY_MAP_EXPR;
        }
        StringBuilder builder = new StringBuilder().append('{');
        for (Entry<?, ?> e : value.entrySet()) {
            builder.append(String.valueOf(e.getKey())).append(':').append(String.valueOf(e.getValue())).append(',');
        }
        builder.setLength(builder.length() - 1);

        return builder.append('}').toString();
    }
Update value of the given object or create a new instance if {@code ref} is
null.

@param ref       object to update, could be null
@param value     value
@param keyType   non-null class of key
@param valueType non-null class of value
@return same object as {@code ref} or a new instance if it's null
clickhouse-data/src/main/java/com/clickhouse/data/value/ClickHouseMapValue.java