首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Postgres驱动程序: PSQLException:返回或接近返回时的语法错误

Postgres驱动程序: PSQLException:返回或接近返回时的语法错误
EN

Stack Overflow用户
提问于 2014-07-08 15:42:05
回答 3查看 15.5K关注 0票数 13

出于某种原因,JDBC PostgreSQL驱动程序正在添加:,将*返回到select语句的末尾。为什么?

代码:

代码语言:javascript
复制
protected static final String AUTH_QUERY = "SELECT \"SECRET\" FROM \"user\" WHERE \"NAME\" = :name";

String password = sql2o.open().createQuery(AUTH_QUERY).addParameter("name", username).executeScalar(String.class);

异常:

代码语言:javascript
复制
org.postgresql.util.PSQLException: ERROR: syntax error at or near "RETURNING"
  Position: 47
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2161)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1890)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:559)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:417)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:302)
    at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76)
    at org.sql2o.Query.executeScalar(Query.java:533)
    at org.sql2o.Query.executeScalar(Query.java:577)
    at org.sql2o.Query.executeScalar(Query.java:568)

数据源:

代码语言:javascript
复制
<Configure id="wac" class="org.eclipse.jetty.webapp.WebAppContext">

    <New id="mydb" class="org.eclipse.jetty.plus.jndi.Resource">
        <Arg></Arg>
        <Arg>jdbc/mydb</Arg>
        <Arg>
            <New class="com.mchange.v2.c3p0.ComboPooledDataSource">
                <Set name="driverClass">org.postgresql.Driver</Set>
                <Set name="jdbcUrl">jdbc:postgresql://localhost:5432/mydb</Set>
                <Set name="user">user</Set>
                <Set name="password">pass</Set>
            </New>
        </Arg>
    </New>
</Configure>

PostgreSQL JDBC驱动程序版本

代码语言:javascript
复制
<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>9.3-1101-jdbc41</version>
</dependency>

包捕获

https://postimg.cc/image/gbl2dq4zx/

代码语言:javascript
复制
No.     Time           Source                Destination           Protocol Length Info
     12 0.175636000    127.0.0.1             127.0.0.1             PGSQL    182    >P/B/D/E/S

Frame 12: 182 bytes on wire (1456 bits), 182 bytes captured (1456 bits) on interface 0
PostgreSQL
    Type: Parse
    Length: 69
    Statement: 
    Query: SELECT "SECRET" FROM "user" WHERE "NAME" = $1 RETURNING *
    Parameters: 1
        Type OID: 1043
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-07-08 15:56:31

这看起来像一个sql2o问题。对bug报告的评论说:

使用PostgreSQL时,所有SELECT语句都将失败,消息是: org.postgresql.util.PSQLException: ERROR:语法错误在或接近“返回”时 似乎与本期有关 这个问题已经用1.1.2版本修正了。 该修补程序要求在创建新的QuirkMode实例时将sql2o枚举标志设置为PostgreSQL。默认情况下,它会将查询的默认行为更改为不获取生成的键。当需要获取生成的键时,应该设置generateQuery方法中的generateQuery参数。

从Sql2o 1.6.0开始,包含sql2o-postgres依赖项,并使用new PostgresQuirks()而不是QuirksMode

票数 10
EN

Stack Overflow用户

发布于 2014-12-22 19:49:15

我所做的最简单的方法是在sql代码的末尾添加“;-”:

代码语言:javascript
复制
String sql = "INSERT INTO testTable(var1, var2) values ("1","2"), ("1","2") RETURNING id;--";

PreparedStatement ps = getConnection().prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
ps.executeUpdate();
ResultSet rs = ps.getGeneratedKeys();
票数 12
EN

Stack Overflow用户

发布于 2019-02-01 08:55:47

在我的例子中,当您尝试插入空的对象列表时发生了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24636120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档