База данных H2: ожидается "ВСЕ, ЛЮБОЕ, НЕКОТОРЫЕ, ВЫБРАТЬ, ИЗ, С" - PullRequest
0 голосов
/ 14 мая 2018

Я использую H2 как базу данных в памяти для модульного тестирования нашего приложения.Этот запрос выдает ошибку expected "ALL, ANY, SOME, SELECT, FROM, WITH" для этого SQL-запроса

SELECT CF.*, ROWNUM CASHFLOW_INDEX
FROM ( SELECT * FROM
TB_CASHFLOWS CFW WHERE CFW.CASHFLOW_DATE >= :runDate AND
CFW.CASHFLOW_TYPE <> 'ISSUE' AND CFW.ISIN = :securityCode ORDER BY
CFW.CASHFLOW_DATE,CFW.CASHFLOW_TYPE ASC ) CF

в расположении runDate, как показано ниже:

SELECT CF.*, ROWNUM CASHFLOW_INDEX
FROM ( SELECT * FROM
TB_CASHFLOWS CFW WHERE CFW.CASHFLOW_DATE >= :[*]RUNDATE AND
CFW.CASHFLOW_TYPE <> 'ISSUE' AND CFW.ISIN = :SECURITYCODE ORDER BY
CFW.CASHFLOW_DATE,CFW.CASHFLOW_TYPE ASC ) CF

Но тот же запрос работает нормально в консоли h2, когдапараметры задаются как '2017-02-28' и 'USD_TREASURY_28FEB'.Этот запрос будет выполнен шаблоном Spring JDBC.Это проблема с тем, как параметры передаются для H2?

Java-код, как показано ниже:

Object[] cashflowQueryArgs = new Object[] {"2017-02-28","USD_TREASURY_28FEB" };

List<Cashflow> instrumentCashflows = getJdbcTemplate().query(
    cashflowsQuery, 
    cashflowQueryArgs,
    new BeanPropertyRowMapper<Cashflow>(Cashflow.class));

1 Ответ

0 голосов
/ 14 мая 2018

К счастью, я нашел решение.Я думаю, что H2 не поддерживает именованные параметры.Поэтому я изменил именованные параметры на обычные вопросительные знаки, и это сработало!

SELECT CF.*, ROWNUM CASHFLOW_INDEX
FROM ( SELECT * FROM
TB_CASHFLOWS CFW WHERE CFW.CASHFLOW_DATE >= ? AND
CFW.CASHFLOW_TYPE <> 'ISSUE' AND CFW.ISIN = ? ORDER BY
CFW.CASHFLOW_DATE,CFW.CASHFLOW_TYPE ASC ) CF

Обновлено для именованных параметров.

В случае Oracle SQL - шаблон jdbc для пружиннормально работает как для нормальных, так и для именованных параметров, когда в метод запроса передается массив аргументов.Но для H2, я должен использовать шаблон именованных параметров вместе с SqlParameterSource.Пример ниже:

MapSqlParameterSource cashflowQueryParamSource = new MapSqlParameterSource();
cashflowQueryParamSource.addValue("runDate", cashflowQueryArgs[0]);
cashflowQueryParamSource.addValue("securityCode", cashflowQueryArgs[1]);

List<Cashflow> instrumentCashflows = namedJdbcTemplate.query(cashflowsQuery, cashflowQueryParamSource,
                new BeanPropertyRowMapper<Cashflow>(Cashflow.class));

Надеюсь, это поможет.

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