Java Postgres JDBC驱动程序:PSQLException:返回时或接近返回时出现语法错误
出于某种原因,JDBC PostgreSQL驱动程序正在向select语句末尾添加:返回*。 为什么? 代码:Java Postgres JDBC驱动程序:PSQLException:返回时或接近返回时出现语法错误,java,postgresql,jdbc,Java,Postgresql,Jdbc,出于某种原因,JDBC PostgreSQL驱动程序正在向select语句末尾添加:返回*。 为什么? 代码: protected static final String AUTH_QUERY = "SELECT \"SECRET\" FROM \"user\" WHERE \"NAME\" = :name"; String password = sql2o.open().createQuery(AUTH_QUERY).addParameter("name", username).execut
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);
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)
<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>
例外情况:
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);
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)
<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>
数据源(JNDI):
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);
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)
<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>
这看起来像是一个大问题。关于bug报告的评论说:
使用PostgreSQL时,所有SELECT语句都将失败,并显示以下消息:
org.postgresql.util.PSQLException:错误:语法错误位于或接近
“返回”
似乎与
版本1.1.2已修复此问题
修复程序要求在以下情况下将QuirkMode枚举标志设置为PostgreSQL:
正在创建sql2o的新实例。它改变了用户的默认行为
默认情况下不获取生成密钥的查询。当需要的时候
fetch generated keys,在
应设置generateQuery方法
自Sql2o 1.6.0以来,包括Sql2o postgres依赖项,并使用
new postgresworks()
而不是QuirksMode
我这样做的最简单方法是在sql代码末尾添加“;--”:
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();
在我的例子中,当你试图插入空的对象列表时发生了。/line 148感谢
newsql2o(dataSource,QuirksMode.PostgreSQL)
解决了我的问题因为Sql2o 1.6.0,你需要包含Sql2o-postgres
依赖项并使用new-postgrescrks()
而不是QuirksMode
。因为PreparedStatement在末尾添加了一些内容,它会中断返回选项。若你们想知道到底发生了什么,你们应该调试你们对数据库的请求。。