BadSqlGrammarException: PreparedStatementCallback;плохая грамматика SQL, когда я даю аргумент метки времени - PullRequest
2 голосов
/ 25 сентября 2019

В моем Java-приложении раньше у меня был SQL-запрос, такой как ниже:

INSERT INTO "KPI_MEASURE" (
        id,
        created_at,
        kpi_project_id,
        kpi_frequency_id,
        kpi_metric_id,
        branch,
        value
    )
SELECT
    nextval('"KPI_MEASURE_ID_seq"'::regclass),
    now(),
    kpi_measure.kpi_project_id,
    kpi_measure.kpi_frequency_id,
    kpi_measure.kpi_metric_id ,
    kpi_measure.branch ,
    sum(kpi_measure.value)
FROM "KPI_MEASURE" kpi_measure
    INNER JOIN "KPI_METRIC" kpi_metric                      ON kpi_measure.kpi_metric_id = kpi_metric.id
    INNER JOIN "KPI_PROJECT" kpi_project                    ON kpi_measure.kpi_project_id = kpi_project.id
    INNER JOIN "KPI_AGGREGATION_PROJECT" kpi_agg_project    ON kpi_project.name = kpi_agg_project.child_project_name
    WHERE kpi_metric.aggregated = false
GROUP BY kpi_measure.branch, kpi_measure.kpi_metric_id, kpi_measure.kpi_project_id, kpi_project.name, kpi_measure.kpi_frequency_id;

Я выполнил этот sql с jdbcTemplate.update, и он работал.
Но недавно я изменилзначение now() по аргументу: :today_date, я даю этот аргумент с моим кодом:

Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put(TODAY_DATE, today); // TODAY_DATE = today_date

jdbcTemplate.update(sql, parameters);

Но теперь, это создает ошибку:

org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback;Неверная грамматика SQL
...
Вложенное исключение - org.postgresql.util.PSQLException: расширение hstore не установлено.

Я не понимаю, почему это ошибка, посколькуМне сказали сделать, когда мы хотим добавить аргумент с запросом jdbc.


Редактировать:

Тип данных столбца - timestamp without time zone, а переменная today -типа String.
Полагаю, я должен был использовать Timestamp, поэтому я изменил свой код:

Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put(TODAY_DATE, new Timestamp(System.currentTimeMillis())); // TODAY_DATE = today_date

jdbcTemplate.update(sql, parameters);

Теперь у меня только ошибка

"PSQLException: расширение hstore не установлено."

Возможно, мне нужно добавить hstore, но я не могу понять, почему.

1 Ответ

2 голосов
/ 25 сентября 2019

Вы используете JdbcTenmplate с именованными параметрами, но JdbcTemplate поддерживает только позиционные параметры (?).Замените JdbcTemplate на NamedParameterJdbcTemplate или перепишите ваш запрос как:

INSERT INTO "KPI_MEASURE" (
        id,
        created_at,
        kpi_project_id,
        kpi_frequency_id,
        kpi_metric_id,
        branch,
        value
    )
SELECT
    nextval('"KPI_MEASURE_ID_seq"'::regclass),
    ?,
    kpi_measure.kpi_project_id,
    kpi_measure.kpi_frequency_id,
    kpi_measure.kpi_metric_id ,
    kpi_measure.branch ,
    sum(kpi_measure.value)
FROM "KPI_MEASURE" kpi_measure
    INNER JOIN "KPI_METRIC" kpi_metric                      ON kpi_measure.kpi_metric_id = kpi_metric.id
    INNER JOIN "KPI_PROJECT" kpi_project                    ON kpi_measure.kpi_project_id = kpi_project.id
    INNER JOIN "KPI_AGGREGATION_PROJECT" kpi_agg_project    ON kpi_project.name = kpi_agg_project.child_project_name
    WHERE kpi_metric.aggregated = false
GROUP BY kpi_measure.branch, kpi_measure.kpi_metric_id, kpi_measure.kpi_project_id, kpi_project.name, kpi_measure.kpi_frequency_id;

и вызовите jdbcTemplate.update(sql, new Timestamp(System.currentTimeMillis()));

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...