2014-07-08 34 views
11

Herhangi bir nedenle JDBC PostgresSQL sürücüsü aşağıdaki ifadeleri ekliyor: RETURNING * select ifadelerinin sonuna. Herhangi birinin neden olduğu hakkında bir fikri var mı?Postgres JDBC sürücüsü: PSQLException: sözdizimi hatası RETURNING

Kodu:

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); 

İstisna:

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) 

Veri kaynağı (JNDI):

<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 sürücüsü sürüm

<dependency> 
    <groupId>org.postgresql</groupId> 
    <artifactId>postgresql</artifactId> 
    <version>9.3-1101-jdbc41</version> 
</dependency> 

Paket yakalama

http://postimg.org/image/gbl2dq4zx/

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 
+0

https://github.com/pgjdbc/pgjdbc/blob/master/org/ postgresql/jdbc3/AbstractJdbc3Statement.java/line 148 – tty

cevap

8

Bu problem with sql2o benziyor. hata raporu yorumlar ki:

Sql2o 1.6.0 yana

Whe using PostgreSQL, all SELECT statements will fail with message: org.postgresql.util.PSQLException: ERROR: syntax error at or near "RETURNING"

Seems to be related to this issue

This has been fixed with version 1.1.2.

The fix requires the QuirkMode enum flag to be set to PostgreSQL when creating a new instance of sql2o. It changes default behaviour of queries to NOT fetch generated keys by default. When it is needed to fetch generated keys, the returnGeneratedKeys parameter in the generateQuery method should be set.

, sql2o-postgres bağımlılık içerir ve new PostgresQuirks() yerine QuirksMode kullanın.

+1

Teşekkürler 'yeni Sql2o (dataSource, QuirksMode.PostgreSQL) 'sorunumu çözdü – tty

+0

Sql2o 1.6.0'dan beri' sql2o-postgres' bağımlılığını eklemeniz ve 'new “QuirksMode” yerine PostgresQuirks(). – Zout

+0

@Zout: Cevabınız dahil olmak üzere teşekkür ederim. –

9

Bunu ekleyerek oldu yaptığım en kolay yolu "; -" sql kodunun sonuna:

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(); 
+0

müthiş çözüm :) –

+0

Bu neden çalışıyor? – cdmckay

+1

PreparedStatement sonunda bir şey eklediğinden ve dönüş seçeneğini bozduğundan. Tam olarak ne olduğunu görmek isterseniz, isteklerinizi veritabanına ayıklamanız gerekir. – Ariloum

İlgili konular