H2 数据库:预期"ALL, ANY, SOME, SELECT, FROM, WITH"



我正在使用 H2 作为内存数据库来对我们的应用程序进行单元测试。此查询为此 sql 查询提供错误expected "ALL, ANY, SOME, SELECT, FROM, WITH"

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

在运行日期位置,如下所示:

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

但是当参数以"2017-02-28"和"USD_TREASURY_28FEB"给出时,相同的查询在 h2 控制台中工作正常。此查询将由 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));

幸运的是,我找到了解决方案。我认为 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,当参数数组传递给查询方法时,spring 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));

希望这有帮助。

最新更新