java - Spring Hibernate 在查询中添加 _

标签 java spring hibernate spring-mvc

我在创建类时遇到问题。

车辆(车辆)

import java.io.Serializable;
import javax.persistence.*;
import java.util.List;


/**
 * The persistent class for the vehiculo database table.
 * 
 */
@Entity
@Table(name="vehiculo")
@NamedQuery(name="Vehiculo.findAll", query="SELECT v FROM Vehiculo v")
public class Vehiculo implements Serializable {
    private static final long serialVersionUID = 1L;
    private int idvehiculo;
    private int capacidad;
    private String matricula;
    private int vacante;
    private List<PersonaFisica> personaFisicas;
    private TipoVehiculo tipoVehiculo;

    public Vehiculo() {
    }


    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(unique=true, nullable=false, name= "idvehiculo")
    public int getIdvehiculo() {
        return this.idvehiculo;
    }

    public void setIdvehiculo(int idvehiculo) {
        this.idvehiculo = idvehiculo;
    }


    @Column(nullable=false)
    public int getCapacidad() {
        return this.capacidad;
    }

    public void setCapacidad(int capacidad) {
        this.capacidad = capacidad;
    }


    @Column(length=12)
    public String getMatricula() {
        return this.matricula;
    }

    public void setMatricula(String matricula) {
        this.matricula = matricula;
    }


    @Column(nullable=false)
    public int getVacante() {
        return this.vacante;
    }

    public void setVacante(int vacante) {
        this.vacante = vacante;
    }


    //bi-directional many-to-one association to PersonaFisica
    @OneToMany(mappedBy="vehiculo")
    public List<PersonaFisica> getPersonaFisicas() {
        return this.personaFisicas;
    }

    public void setPersonaFisicas(List<PersonaFisica> personaFisicas) {
        this.personaFisicas = personaFisicas;
    }

    public PersonaFisica addPersonaFisica(PersonaFisica personaFisica) {
        getPersonaFisicas().add(personaFisica);
        personaFisica.setVehiculo(this);

        return personaFisica;
    }

    public PersonaFisica removePersonaFisica(PersonaFisica personaFisica) {
        getPersonaFisicas().remove(personaFisica);
        personaFisica.setVehiculo(null);

        return personaFisica;
    }


    //bi-directional many-to-one association to TipoVehiculo
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="tipo_vehiculo_idTipoVehiculo", nullable=false, referencedColumnName="idTipoVehiculo")
    public TipoVehiculo getTipoVehiculo() {
        return this.tipoVehiculo;
    }

    public void setTipoVehiculo(TipoVehiculo tipoVehiculo) {
        this.tipoVehiculo = tipoVehiculo;
    }

}

车辆类型

import java.io.Serializable;
import javax.persistence.*;
import java.util.List;


/**
 * The persistent class for the tipo_vehiculo database table.
 * 
 */
@Entity
@Table(name="tipo_vehiculo")
@NamedQuery(name="TipoVehiculo.findAll", query="SELECT t FROM TipoVehiculo t")
public class TipoVehiculo implements Serializable {
    private static final long serialVersionUID = 1L;
    private int idTipoVehiculo;
    private String codigo;
    private String descripcion;
    private List<Vehiculo> vehiculos;

    public TipoVehiculo() {
    }


    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(unique=true, nullable=false,name="idTipoVehiculo")
    public int getIdTipoVehiculo() {
        return this.idTipoVehiculo;
    }

    public void setIdTipoVehiculo(int idTipoVehiculo) {
        this.idTipoVehiculo = idTipoVehiculo;
    }


    @Column(nullable=false, length=20)
    public String getCodigo() {
        return this.codigo;
    }

    public void setCodigo(String codigo) {
        this.codigo = codigo;
    }


    @Column(length=140)
    public String getDescripcion() {
        return this.descripcion;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }


    //bi-directional many-to-one association to Vehiculo
    @OneToMany(mappedBy="tipoVehiculo")
    public List<Vehiculo> getVehiculos() {
        return this.vehiculos;
    }

    public void setVehiculos(List<Vehiculo> vehiculos) {
        this.vehiculos = vehiculos;
    }

    public Vehiculo addVehiculo(Vehiculo vehiculo) {
        getVehiculos().add(vehiculo);
        vehiculo.setTipoVehiculo(this);

        return vehiculo;
    }

    public Vehiculo removeVehiculo(Vehiculo vehiculo) {
        getVehiculos().remove(vehiculo);
        vehiculo.setTipoVehiculo(null);

        return vehiculo;
    }

}

问题是,当 hibernate 尝试执行查询时,它会:

select vehiculo0_.idvehiculo as idvehicu1_25_, vehiculo0_.capacidad as capacida2_25_, 
        vehiculo0_.matricula as matricul3_25_, vehiculo0_.tipo_vehiculo_id_tipo_vehiculo as tipo_veh5_25_, 
        vehiculo0_.vacante as vacante4_25_ 
 from vehiculo vehiculo0_

如您所见,该属性称为:tipo_vehiculo_idTipoVehiculo,但在查询中它不断添加“_”,如下所示:tipo_vehiculo_id_tipo_vehiculo ....

在互联网上我发现我可以使用新的 NamingStrategy 来避免这种情况,我找到的类是这样的:

package net.petrikainulainen.hibernate.util;
import org.hibernate.cfg.ImprovedNamingStrategy;

/**
 * A custom naming strategy implementation which uses following naming conventions:
 * <ul>
 *     <li>Table names are lower case and in plural form. Words are separated with '_' character.</li>
 *     <li>Column names are lower case and words are separated with '_' character.</li>
 * </ul>
 * @author Petri Kainulainen
 */
public class CustomNamingStrategy extends ImprovedNamingStrategy {

    private static final String PLURAL_SUFFIX = "s";

    /**
     * Transforms class names to table names by using the described naming conventions.
     * @param className
     * @return  The constructed table name.
     */
    @Override
    public String classToTableName(String className) {
        String tableNameInSingularForm = super.classToTableName(className);
        return transformToPluralForm(tableNameInSingularForm);
    }

    private String transformToPluralForm(String tableNameInSingularForm) {
        StringBuilder pluralForm = new StringBuilder();

        pluralForm.append(tableNameInSingularForm);
        pluralForm.append(PLURAL_SUFFIX);

        return pluralForm.toString();
    }
}

但是我没有看到任何关于“_”的地方..我也尝试添加下一个代码,看看它是否有效,但还没有任何结果。

      @Override
        public String propertyToColumnName(String propertyName) {
            // TODO Auto-generated method stub
            return propertyName;
        }

         @Override
        public String columnName(String columnName) {
            // TODO Auto-generated method stub
            return columnName;
        }

我正在使用 HIbernate+JPA、Spring 以及如下所示的 application.yml:以及 org.hibernate.dialect 的所有可能类型,但没有结果

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/gotowork_db?useSSL=false
    username: root
    password: root
  jpa:
    show-sql: true
    hibernate:
      naming:
        strategy: es.gfi.CustomNamingStrategy
    properties:
      hibernate:
        dialect: org.hibernate.dialect.MySQLDialect

有没有办法避免camelCap更改为“_”???...并且不必更改数据库列名称?

谢谢

最佳答案

经过几个小时的测试后发现问题在于所使用的命名策略,在创建查询时将所有大写字母更改为“_”+小写。

正如您在问题中的代码中看到的

//bi-directional many-to-one association to TipoVehiculo
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="tipo_vehiculo_idTipoVehiculo", nullable=false, referencedColumnName="idTipoVehiculo")
    public TipoVehiculo getTipoVehiculo() {
        return this.tipoVehiculo;
    }

它确实:tipo_vehiculo_id_tipo_vehiculo,使查询看起来像:

SELECT 
    vehiculo0_.idvehiculo AS idvehicu1_25_,
    vehiculo0_.capacidad AS capacida2_25_,
    vehiculo0_.matricula AS matricul3_25_,
    vehiculo0_.tipo_vehiculo_id_tipo_vehiculo AS tipo_veh5_25_,
    vehiculo0_.vacante AS vacante4_25_
FROM
    vehiculo vehiculo0_

所以我改成这样:

//bi-directional many-to-one association to TipoVehiculo
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="tipo_vehiculo_idtipovehiculo", nullable=false)
    public TipoVehiculo getTipoVehiculo() {
        return this.tipoVehiculo;
    }
正如你在名称中看到的,我删除了所有大写字母,因为 MySQL 不区分大小写,所以它是同一件事,即使在表中它的所有属性都使用大写字母。这种情况发生在 @joincolumn 中名称的所有类中。让 hibernate 创建正确的查询,以便它可以正确执行:

SELECT 
    vehiculo0_.idvehiculo AS idvehicu1_25_,
    vehiculo0_.capacidad AS capacida2_25_,
    vehiculo0_.matricula AS matricul3_25_,
    vehiculo0_.tipo_vehiculo_idtipovehiculo AS tipo_veh5_25_,
    vehiculo0_.vacante AS vacante4_25_
FROM
    vehiculo vehiculo0_

关于java - Spring Hibernate 在查询中添加 _,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39075757/

相关文章:

java - 如何在 JUnit 4.12 中组合 @Rule 和 @ClassRule

java - Eclipse 启用多重分包

java - 从 servlet 响应生成动态复选框值

java - AcceptHeaderLocaleResolver 错误

java - Hibernate + MySQL 报告数据的最佳实践

java - 每天跟踪 JPA/Hibernate 更新/插入的日志文件

java - 我可以在 url 哈希中放入未编码的斜杠吗?

java - Spring 3.1 ViewResolver 用于本地内容(swf 对象)

java - 尝试获取对象表单表时,“SQL 语法有错误”

java - 尽管在 spring-boot-maven-plugin 中配置了排除,但日志依赖项仍然包含在 lib 文件夹中