Cómo asignar un campo de entidad cuyo nombre es una palabra reservada en JPA

Resuelto TJR asked hace 14 años • 8 respuestas
@Column(name="open")

Usando el dialecto sqlserver con hibernación.

[SchemaUpdate] Unsuccessful: create table auth_session (id numeric(19,0) identity not null, active tinyint null, creation_date datetime not null, last_modified datetime not null, maxidle int null, maxlive int null, open tinyint null, sessionid varchar(255) not null, user_id numeric(19,0) not null, primary key (id), unique (sessionid))
[SchemaUpdate] Incorrect syntax near the keyword 'open'.

Habría esperado que Hibernate usara un identificador entre comillas al crear la tabla.

¿Alguna idea sobre cómo manejar esto... además de cambiar el nombre del campo?

TJR avatar Feb 09 '10 03:02 TJR
Aceptado

Con Hibernate como proveedor de JPA 1.0, puede escapar de una palabra clave reservada encerrándola entre comillas invertidas:

@Column(name="`open`")

Esta es la sintaxis heredada de Hibernate Core:

5.4. Identificadores entre comillas SQL

Puede forzar a Hibernate a citar un identificador en el SQL generado encerrando el nombre de la tabla o columna entre comillas invertidas en el documento de mapeo. Hibernate utilizará el estilo de cita correcto para el dialecto SQL. Suelen ser comillas dobles, pero SQL Server usa corchetes y MySQL usa comillas invertidas.

<class name="LineItem" table="`Line Item`">
    <id name="id" column="`Item Id`"/><generator class="assigned"/></id>
    <property name="itemNumber" column="`Item #`"/>
    ...
</class>

En JPA 2.0, la sintaxis está estandarizada y pasa a ser:

@Column(name="\"open\"")

Referencias

  • Guía de referencia de hibernación
  • 5.4. Identificadores entre comillas SQL
  • Especificación JPA 2.0
  • 2.13 Denominación de objetos de base de datos

Preguntas relacionadas

  • Hibernate, MySQL y tabla llamada "Repetir" - comportamiento extraño
  • Escape automático de palabras reservadas para tablas y columnas de Hibernate
Pascal Thivent avatar Aug 11 '2010 21:08 Pascal Thivent

Tuve el mismo problema, pero con un nombre de tabla llamado Transaction. si estableces

hibernate.globally_quoted_identifiers=true

Luego se citarán todos los identificadores de la base de datos.

Encontré mi respuesta aquí Carácter especial en el nombre de la tabla hibernar dando error

Y encontré todas las configuraciones disponibles aquí https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/appendices/Configurations.html

Sin embargo, no se pudieron encontrar mejores documentos para esto.

En mi caso, la configuración estaba en mi archivo de propiedades de Spring. Como se mencionó en los comentarios, también podría estar en otros archivos de configuración relacionados con la hibernación.

Rafiek avatar Nov 10 '2017 13:11 Rafiek

Escapar manualmente de las palabras clave reservadas

Si estás usando JPA, puedes escapar con comillas dobles:

@Column(name = "\"open\"")

Si está utilizando la API nativa de Hibernate, puede escapar de ellas usando comillas invertidas:

@Column(name = "`open`")

Escapar automáticamente de palabras clave reservadas

Si desea escapar automáticamente de las palabras clave reservadas, puede establecer la propiedad de configuración trueespecífica de Hibernate :hibernate.globally_quoted_identifiers

<property
    name="hibernate.globally_quoted_identifiers"
    value="true"
/>

formato yaml

spring:
  jpa:
    properties:
      hibernate:
        globally_quoted_identifiers: true
Vlad Mihalcea avatar Jan 29 '2019 17:01 Vlad Mihalcea

Si lo usa como se muestra a continuación, debería funcionar.

@Column(name="[order]")
private int order;
Raman avatar Jul 29 '2010 11:07 Raman