jdbcTemplate и необработанный столбец JSON - PullRequest
0 голосов
/ 08 октября 2018

Предположим, я запрашиваю таблицу, которая содержит json в столбце, или сам создаю json с подзапросом, подобным этому:

select
p.name,
(select json_build_array(json_build_object('num', a.num, 'city', a.city)) from address a where a.id = p.addr) as addr
from person p;

Как я могу указать NamedParameterJdbcTemplate Spring'у не выходить из addr столбец, но оставить его в покое?

Пока он настаивает на возвращении мне что-то вроде этого:

[{
    name: "John",
    addr: {
        type: "json",
        value: "{"num" : "123", "city" : "Luxembourg"}"
    }
}]

1 Ответ

0 голосов
/ 04 декабря 2018

Это рабочее решение.

Сервис:

@Transactional(readOnly = true)
public String getRawJson() {
    String sql = "select json_agg(row_to_json(json)) from ( "
    + "select "
    + "p.id, "
    + "p.name, "
    + "(select array_to_json(array_agg(row_to_json(c))) from ( "
    + " ... some subselect ... "
    + ") c ) as subq "
    + "from person p "
    + "where type = :type "
    + ") json";

    MapSqlParameterSource params = new MapSqlParameterSource("type", 1);

    return jdbcTemplate.queryForObject(sql, params, String.class);
}

Контроллер:

@ResponseBody
@GetMapping(value = "/json", produces = MediaType.APPLICATION_JSON_VALUE)
public String getRawJson() {
    return miscService.getRawJson();
}

Ключ - комбинация json_agg и row_to_json / array_to_jsonплюс возврат String, чтобы избежать любых преобразований типов.

...