How to map an entity field whose name is a reserved word in JPA How to map an entity field whose name is a reserved word in JPA sql-server sql-server

How to map an entity field whose name is a reserved word in JPA


With Hibernate as JPA 1.0 provider, you can escape a reserved keyword by enclosing it within backticks:

@Column(name="`open`")

This is the syntax inherited from Hiberate Core:

5.4. SQL quoted identifiers

You can force Hibernate to quote an identifier in the generated SQL by enclosing the table or column name in backticks in the mapping document. Hibernate will use the correct quotation style for the SQL Dialect. This is usually double quotes, but the SQL Server uses brackets and MySQL uses backticks.

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

In JPA 2.0, the syntax is standardized and becomes:

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

References

Related questions


Had the same problem, but with a tablename called Transaction. If you set

hibernate.globally_quoted_identifiers=true

Then all database identifiers will be quoted.

Found my answer hereSpecial character in table name hibernate giving error

And found all available settings herehttps://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/appendices/Configurations.html

Could not find better docs for this though.

In my case the setting was in my Spring properties file. As mentioned in the comments, it could also be in other, hibernate related, configuration files.


Manually escaping the reserved keywords

If you are using JPA, you can escape with double quotes:

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

If you're using Hibernate native API, then you can escape them using backticks:

@Column(name = "`open`")

Automatically escaping reserved keywords

If you want to automatically escape reserved keywords, you can set to true the Hibernate-specific hibernate.globally_quoted_identifiers configuration property:

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

Yaml format

spring:  jpa:    properties:      hibernate:        globally_quoted_identifiers: true