【问题标题】:Several close placeholders in postgres prepared statementpostgres 准备好的语句中的几个关闭占位符
【发布时间】:2011-11-09 09:43:21
【问题描述】:

我将 Spring JbdcTemplate 与 Postgres 一起使用。

遇到 Postrgres JDBC 内部准备好的语句实现的问题原因

我的查询字符串是:

private static final String SELECT_ALL_PARTIALLY =
            "SELECT login, added FROM admin ORDER BY ? ? OFFSET ? LIMIT ?";

我想像这样使用它:

List matches = getJdbcTemplate().query(SELECT_ALL_PARTIALLY,
                (new Object[]{
                    column, // "login" or "added"
                    order,  // "asc" or "desc"
                    offset, 
                    limit
                }),
                new RowMapper() {
                    ...

问题在于...ORDER BY ? ? OFFSET...

org.postgresql.util.PSQLException: ERROR: syntax error at or near "$2"
  Position: 61
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2102)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1835)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:500)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:388)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:273)
    at org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:648) ...

我怎样才能分开这两个占位符之类的?

【问题讨论】:

    标签: sql spring postgresql jdbc prepared-statement


    【解决方案1】:

    Postgres 不允许您将排序方向指定为参数。您需要为ascdesc 订单创建不同的查询字符串,然后选择其中一个执行。

    【讨论】:

    • 哦。你确定吗?那很糟糕。如果我需要对多个列进行排序,那么我需要对 asc/desc 参数的每个组合进行查询怎么办?有什么解决方法吗?
    • @user976426:列名可以指定为参数,只有方向不能。
    • @axtavt 您是否积极回复:使用列的占位符? PG 占位符似乎只保存值(不是列名)。列名是什么数据类型,文本?需要明确的是,如果这确实有效,那就太好了。 postgresql.org/docs/12/sql-prepare.html 但是,给定一个表usersidinteger 类型,执行类似PREPARE bar1 AS select * from users ORDER BY $1; EXECUTE bar1(id); 的语句至少会得到“列“id”不存在”。 EXECUTE bar1("id") 也是如此。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    • 2011-12-29
    • 1970-01-01
    • 2020-08-20
    • 2011-07-26
    • 2011-10-01
    相关资源
    最近更新 更多