2012-07-06 23 views
17

Estoy usando un marco (Jodd) que agrega el alias de tabla a los nombres de columna en un SQL Select. Parece SQL bien formado, pero Postgres se ahoga en él.Postgres no aceptará un alias de tabla antes del nombre de columna

update GREETING Greeting 
    set Greeting.ID=5, 
     Greeting.NAME='World', 
     Greeting.PHRASE='Hello World!' 
where (Greeting.ID=5) 

da un error:

Error: ERROR: column "greeting" of relation "greeting" does not exist 
SQLState: 42703 

¿Hay una manera de conseguir Postgres para aceptar que SQL? Mi otra alternativa es piratear el framework, lo que no quiero hacer.

+1

¿Ha intentado establecer un modo de aliasing de nombre de columna diferente (http://jodd.org/doc/db/sqlgenerator.html#Column-name-aliasing)? De forma predeterminada, se establece TABLE_REFERENCE, que agregará alias de tabla para las columnas, pero puede probar otras dos. Esto se puede establecer mediante el método DbOomManager # setDefaultColumnAliasType(), en algún lugar del inicio de la aplicación. Además, no dude en ponerse en contacto con Jodders con el fragmento de código real, están dispuestos a ayudar :) – igr

Respuesta

26

El problema es que incluye el alias de la tabla en la cláusula SET, en las columnas. Consulte la documentación de UPDATE in Postgres docs:

column

The name of a column in table. The column name can be qualified with a subfield name or array subscript, if needed. Do not include the table's name in the specification of a target column — for example, UPDATE tab SET tab.col = 1 is invalid.

Esto es válido en Postgres:

update GREETING Greeting 
set 
    NAME='World', 
    PHRASE='Hello World!' 
where Greeting.ID=5 ; 
3

Comprobar documentación sobre UPDATE declaración, específicamente para el columna parte: es ilegal prefijo columnas con mesa alias en la cláusula SET.

UPDATE GREETING Greeting 
    SET ID=5, NAME='World', PHRASE='Hello World!' 
WHERE (Greeting.ID=5); 
4

Trate de usar la última Jodd, v3.3.7. donde este problema está arreglado

El problema estaba en la biblioteca de Jodd: los métodos de actualización de entidad generaban una declaración de actualización con alias de tabla. La nueva versión simplemente no pone alias de tabla; eso funciona para Postgres y para otras bases de datos también.

Cuestiones relacionadas