2016-08-22 59 views
1

我在创建类时遇到了一个问题。Spring Hibernate在查询中添加_

Vehiculo(运载工具)

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; 
    } 

} 

VehicleType

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_v ehiculo_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,春有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更改为“_”的方法???并且不必更改数据库列名称?

感谢

+0

尝试实施propertyToColumnName还有,你只覆盖类表方法 – tonakai

回答

0

刚刚发现的问题测试的事情小时后,所使用的命名策略,创建查询时更改所有大写字母为“_” +小写。

正如你可以在代码中看到的问题在

//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; 
    } 

正如你可以在名字中看到的,我删除了所有Uppercases,并且由于MySQL不区分大小写,即使在表中它的所有属性都使用大写字母。这发生在@joincolumn中所有名称所在的类中。使休眠建立正确的查询,以便它可以被正确执行:

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_ 
0

尝试这段代码在哪里按照您的要求,你可以做一个合乎逻辑的检查和更换相应的列名的文本。

public class Temp extends ImprovedNamingStrategy { 

    @Override 
    public String columnName(String columnName) { 
     if(columnName.contains("id_tipo_vehiculo")){ 
      String replacedString = columnName.replace("id_tipo_vehiculo", "idTipoVehiculo"); 
      return replacedString; 
     }else{ 
      return columnName; 
     } 
    } 

} 
+0

这样它只是去掉“_”从该行,并有是更多,这意味着我将不得不添加一个案件,并将其从每一个字符串中删除它添加它。 – user2690047