query lower java mysql hibernate jpa spring-data-jpa

java - lower - jpa query uppercase



Spring boot JPA insert en TABLE con nombre en mayúscula con Hibernate (6)

Puedes probar:

@Entity @Table(name = "ITEMS_TO_REGISTER") public class ItemsToRegister implements Serializable { ...

tengo una entidad de tabla mapeada como:

@Entity public class ItemsToRegister implements Serializable{ @Id @Column(name = "ID_ITEM_TO_REGISTER") @GeneratedValue(strategy = GenerationType.AUTO) private int id; .....

Cuando trato de insertar un nuevo registro en la base de datos, el nombre de la tabla se tradujo en minúsculas como: items_to_register, pero mi nombre de tabla es ITEMS_TO_REGISTER ¿Cómo puedo solucionar mi problema sin cambiar la configuración de MySql? (mi.cnf)

Tengo en mi archivo application.properties:

spring.jpa.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect spring.jpa.hibernate.naming_strategy = org.hibernate.cfg.ImprovedNamingStrategy


Deberá escapar del nombre de la tabla con tics (`) para que sea sensible a mayúsculas y minúsculas.

@Table(name = "`ITEMS_TO_REGISTER`")


La solución es agregar:

spring.jpa.hibernate.naming_strategy = org.hibernate.cfg.EJB3NamingStrategy

a la application.properties :)

¡¡¡Sí!!!


En hibernate 5, sería

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

en su archivo application.properties .


Como @jasonleakey sugirió que podemos considerar el uso de naming-strategy como se muestra a continuación.

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

esto le dice a Hibernate que genere SQL exactamente como se especifica en @Table (name = "") o @Column (name = ""). Todo bien.

Pero tenga en cuenta que, al utilizar PhysicalNamingStrategy sin anotaciones @Table, @Column en la clase de entidad, hibernate genera SQL utilizando el nombre de clase y los nombres de variable. Considere la siguiente clase de java

Class Employee { private String firstName; private String lastName; }

entonces el sql generado sería,

select employee0_.firstName,employee0_lastName from Employee employee0_;

Lamentablemente, esta no es una gran opción, ya que normalmente hubiéramos definido las columnas en DB como FIRST_NAME y LAST_NAME y el nombre de la tabla como EMPLOYEE. Si no hubieras usado PhysicalNamingStrategy, el SQL hubiera sido

select employee0_.first_name,employee0_last_name from employee employee0_;

entonces es realmente una elección entre las dos opciones siguientes.

  • Use PhysicalStrategy y defina explícitamente todos los nombres de tablas / columnas en código java con anotaciones @Table y @Column.
    o
  • Defina el nombre de la tabla en minúscula en db y deje que hibernate genere nombres de tabla / columnas para nosotros.

Puede implementar su propia estrategia e invocarla desde application.properties:

spring.jpa.hibernate.naming.physical-strategy=com.proto.CustomPhysicalNamingStrategy

A continuación un ejemplo que siempre escribe en mayúscula la primera letra

import java.io.Serializable; import org.apache.commons.lang3.StringUtils; import org.hibernate.boot.model.naming.Identifier; import org.hibernate.boot.model.naming.PhysicalNamingStrategy; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; public class CustomPhysicalNamingStrategy implements PhysicalNamingStrategy, Serializable { /** * Singleton access */ public static final CustomPhysicalNamingStrategy INSTANCE = new CustomPhysicalNamingStrategy(); @Override public Identifier toPhysicalCatalogName(Identifier name, JdbcEnvironment context) { return capitalize(name); } @Override public Identifier toPhysicalSchemaName(Identifier name, JdbcEnvironment context) { return capitalize(name); } @Override public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) { return capitalize(name); } @Override public Identifier toPhysicalSequenceName(Identifier name, JdbcEnvironment context) { return capitalize(name); } @Override public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) { return capitalize(name); } private Identifier capitalize(Identifier name) { if (name == null) return null; if (name.isQuoted()) return name; String text = StringUtils.capitalize(name.getText()); return Identifier.toIdentifier(text); } }