提问者:小点点

错误由错误的sql语法引起,但它在数据库中工作得很好


我在存储库的方法中有这段SQL代码。它是根据给定的id查找项目的总价。这个价格应该返回一个BigDecimel总价,但是它给我一个错误SQL语法。当我把这个SQL放在我的MariaDB(phpMyAdmin)中时,它工作得很好。为什么这不起作用?

我在Spring存储库中使用Java。

@Override
public BigDecimal vindTotalePrijsByIds(Set<Long> ids) {
    var sql = "select sum(prijs) from films where id in (" +
            "?,".repeat(ids.size()-1) +
            "?)";
    return template.queryForObject(sql, BigDecimal.class, ids);
}

这些是列:(数据库没有问题,适用于所有其他语句)。但是你可以看到我取了正确的值。

id|genreId|标题|股票|保留|价格

我得到这个错误。

jdbc. BadSqlGrammarException:准备状态回调;坏SQL语法[select sum(prijs)从电影中的id在 (?,?)] ; 嵌套异常是java.sql.SQLException:没有为参数2指定值

我的SQL语句有什么问题?为了回答这个问题以验证是否有两个。是的,我用测试(查找id工作的公式)运行了它:

    @Test
    void findtotaleprijsbyids() {
        long idEen = idVanTestFilm();
        long idTwee = idVanTestFilmTwee();
        assertThat(filmRepository.vindTotalePrijsByIds(Set.of(idTwee, idEen))).isEqualByComparingTo(BigDecimal.TEN);
    }

将其插入我的数据库后,插入tFilm. sql(您可以假设我的测试一切都正确)

insert into films (genreId, titel, voorraad, gereserveerd, prijs) values (8, 'testFilm', 5, 0, 5.00),
                                                                         (8, 'testFilmTwee', 5, 0, 5.00);

所以我知道它有两个参数。但是也许我执行错了。现在看那个方向。


共1个答案

匿名用户

调用的方法的签名是queryForObject(String query, Class

return template.queryForObject(sql, BigDecimal.class, ids.toArray());