java.sql.SQLSyntaxErrorException:未知列.JPA实体问题?

时间:2019-05-12 19:20:48

标签: mysql spring-boot jpa java-ee runtime-error

当我尝试向我的Spring Boot应用程序发送GET请求时,我有这个error,我不知道自己错过了什么!

我有这个database,并在Eclipse中创建了 JPA实体和关系,并相应地为我的Spring Boot项目安装了STS(Spring工具套件)。

创建的实体是:

Categoria.java

package gnammy.entities;

import java.io.Serializable;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;

/**
 * The persistent class for the categoria database table.
 * 
 */
@Entity
@Table(name = "categoria")
@NamedQuery(name = "Categoria.findAll", query = "SELECT c FROM Categoria c")
@NamedQuery(name = "Categoria.findByIdRistorante", query = "SELECT DISTINCT c FROM Categoria c INNER JOIN c.portate p INNER JOIN p.ristoranti r WHERE r.idRistorante = :idRistorante")
public class Categoria implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "idCategoria", nullable = false, unique = true, insertable = false, updatable = false)
    private int idCategoria;

    private String descrizione;

    // bi-directional many-to-one association to Portata
    @OneToMany(mappedBy = "categoria")
    private List<Portata> portate;

    public Categoria() {
    }

    public Categoria(String descrizione) {
        super();
        this.descrizione = descrizione;
    }

    public Categoria(int idCategoria, String descrizione) {
        super();
        this.idCategoria = idCategoria;
        this.descrizione = descrizione;
    }

    public int getIdCategoria() {
        return idCategoria;
    }

    public void setIdCategoria(int idCategoria) {
        this.idCategoria = idCategoria;
    }

    public String getDescrizione() {
        return this.descrizione;
    }

    public void setDescrizione(String descrizione) {
        this.descrizione = descrizione;
    }

    public List<Portata> getPortate() {
        return this.portate;
    }

    public void setPortate(List<Portata> portatas) {
        this.portate = portatas;
    }

    public Portata addPortata(Portata portata) {
        getPortate().add(portata);
        portata.setCategoria(this);

        return portata;
    }

    public Portata removePortata(Portata portata) {
        getPortate().remove(portata);
        portata.setCategoria(null);

        return portata;
    }
}

Ordine.java

package gnammy.entities;    

import java.io.Serializable;
import java.util.Date;
import java.util.List;    

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;    

import com.fasterxml.jackson.annotation.JsonFormat;    

/**
 * The persistent class for the ordine database table.
 * 
 */
@Entity
@Table(name = "ordine")
@NamedQuery(name = "Ordine.findAll", query = "SELECT o FROM Ordine o")
public class Ordine implements Serializable {
    private static final long serialVersionUID = 1L;    

    @Id
    @Column(name = "idOrdine", nullable = false, unique = true, insertable = false, updatable = false)
    private int idOrdine;    

    @Column(name = "idRistorante", nullable = false, unique = true, insertable = false, updatable = false)
    private int idRistorante;    

    private String indirizzoConsegna;    

    @Temporal(TemporalType.TIMESTAMP)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date orarioConsegna;    

    private String tipoPagamento;    

    private String note;    

    @Temporal(TemporalType.TIMESTAMP)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date dataOrdine;    

    private float totale;    

    private String cartaDiCredito;    

    // bi-directional many-to-many association to Portata
    @ManyToMany
    @JoinTable(name = "ordine_portata", joinColumns = {
            @JoinColumn(name = "IdOrdine", referencedColumnName = "IdOrdine") }, inverseJoinColumns = {
                    @JoinColumn(name = "IdPortata", referencedColumnName = "IdPortata") })
    private List<Portata> portate;    

    // bi-directional many-to-one association to Ristorante
    @ManyToOne
    @JoinColumn(name = "IdRistorante", referencedColumnName = "IdRistorante")
    private Ristorante ristorante;    

    public Ordine() {
    }    

    public Ordine(int idRistorante, String indirizzoConsegna, Date orarioConsegna, String tipoPagamento, String note,
            Date dataOrdine, float totale, String cartaDiCredito) {
        super();
        this.idRistorante = idRistorante;
        this.indirizzoConsegna = indirizzoConsegna;
        this.orarioConsegna = orarioConsegna;
        this.tipoPagamento = tipoPagamento;
        this.note = note;
        this.dataOrdine = dataOrdine;
        this.totale = totale;
        this.cartaDiCredito = cartaDiCredito;
    }    

    public Ordine(int idOrdine, int idRistorante, String indirizzoConsegna, Date orarioConsegna, String tipoPagamento,
            String note, Date dataOrdine, float totale, String cartaDiCredito) {
        super();
        this.idOrdine = idOrdine;
        this.idRistorante = idRistorante;
        this.indirizzoConsegna = indirizzoConsegna;
        this.orarioConsegna = orarioConsegna;
        this.tipoPagamento = tipoPagamento;
        this.note = note;
        this.dataOrdine = dataOrdine;
        this.totale = totale;
        this.cartaDiCredito = cartaDiCredito;
    }    

    public int getIdOrdine() {
        return idOrdine;
    }    

    public void setIdOrdine(int idOrdine) {
        this.idOrdine = idOrdine;
    }    

    public int getIdRistorante() {
        return idRistorante;
    }    

    public void setIdRistorante(int idRistorante) {
        this.idRistorante = idRistorante;
    }    

    public String getCartaDiCredito() {
        return this.cartaDiCredito;
    }    

    public void setCartaDiCredito(String cartaDiCredito) {
        this.cartaDiCredito = cartaDiCredito;
    }    

    public Date getDataOrdine() {
        return this.dataOrdine;
    }    

    public void setDataOrdine(Date dataOrdine) {
        this.dataOrdine = dataOrdine;
    }    

    public String getIndirizzoConsegna() {
        return this.indirizzoConsegna;
    }    

    public void setIndirizzoConsegna(String indirizzoConsegna) {
        this.indirizzoConsegna = indirizzoConsegna;
    }    

    public String getNote() {
        return this.note;
    }    

    public void setNote(String note) {
        this.note = note;
    }    

    public Date getOrarioConsegna() {
        return this.orarioConsegna;
    }    

    public void setOrarioConsegna(Date orarioConsegna) {
        this.orarioConsegna = orarioConsegna;
    }    

    public String getTipoPagamento() {
        return this.tipoPagamento;
    }    

    public void setTipoPagamento(String tipoPagamento) {
        this.tipoPagamento = tipoPagamento;
    }    

    public float getTotale() {
        return this.totale;
    }    

    public void setTotale(float totale) {
        this.totale = totale;
    }    

    public List<Portata> getPortate() {
        return this.portate;
    }    

    public void setPortate(List<Portata> portate) {
        this.portate = portate;
    }    

    public Ristorante getRistorante() {
        return this.ristorante;
    }    

    public void setRistorante(Ristorante ristorante) {
        this.ristorante = ristorante;
    }
}

Portata.java

package gnammy.entities;    

import java.io.Serializable;
import java.util.List;    

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQuery;
import javax.persistence.Table;    

/**
 * The persistent class for the portata database table.
 *
 */
@Entity
@Table(name = "portata")
@NamedQuery(name = "Portata.findAll", query = "SELECT p FROM Portata p")
@NamedQuery(name = "Portata.findByIdRistorante", query = "SELECT DISTINCT p FROM Portata p INNER JOIN p.ristoranti r WHERE r.idRistorante = :idRistorante")
public class Portata implements Serializable {
    private static final long serialVersionUID = 1L;    

    @Id
    @Column(name = "idPortata", nullable = false, unique = true, insertable = false, updatable = false)
    private int idPortata;    

    @Column(name = "idCategoria", nullable = false, unique = true, insertable = false, updatable = false)
    private int idCategoria;    

    private String nome;    

    private String descrizione;    

    private float prezzo;    

    // bi-directional many-to-many association to Ordine
    @ManyToMany(mappedBy = "portate")
    private List<Ordine> ordini;    

    // bi-directional many-to-one association to Categoria
    @ManyToOne
    @JoinColumn(name = "IdCategoria", referencedColumnName = "IdCategoria")
    private Categoria categoria;    

    // bi-directional many-to-many association to Ristorante
    @ManyToMany(mappedBy = "portate")
    private List<Ristorante> ristoranti;    

    public Portata() {
    }    

    public Portata(int idCategoria, String nome, String descrizione, float prezzo) {
        super();
        this.idCategoria = idCategoria;
        this.nome = nome;
        this.descrizione = descrizione;
        this.prezzo = prezzo;
    }    

    public Portata(int idPortata, int idCategoria, String nome, String descrizione, float prezzo) {
        super();
        this.idPortata = idPortata;
        this.idCategoria = idCategoria;
        this.nome = nome;
        this.descrizione = descrizione;
        this.prezzo = prezzo;
    }    

    public int getIdPortata() {
        return idPortata;
    }    

    public void setIdPortata(int idPortata) {
        this.idPortata = idPortata;
    }    

    public int getIdCategoria() {
        return idCategoria;
    }    

    public void setIdCategoria(int idCategoria) {
        this.idCategoria = idCategoria;
    }    

    public String getDescrizione() {
        return this.descrizione;
    }    

    public void setDescrizione(String descrizione) {
        this.descrizione = descrizione;
    }    

    public String getNome() {
        return this.nome;
    }    

    public void setNome(String nome) {
        this.nome = nome;
    }    

    public float getPrezzo() {
        return this.prezzo;
    }    

    public void setPrezzo(float prezzo) {
        this.prezzo = prezzo;
    }    

    public List<Ordine> getOrdini() {
        return this.ordini;
    }    

    public void setOrdini(List<Ordine> ordini) {
        this.ordini = ordini;
    }    

    public Categoria getCategoria() {
        return this.categoria;
    }    

    public void setCategoria(Categoria categoria) {
        this.categoria = categoria;
    }    

    public List<Ristorante> getRistoranti() {
        return this.ristoranti;
    }    

    public void setRistoranti(List<Ristorante> ristoranti) {
        this.ristoranti = ristoranti;
    }
}

Ristorante.java

package gnammy.entities;    

import java.io.Serializable;
import java.util.List;    

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;    

/**
 * The persistent class for the ristorante database table.
 * 
 */
@Entity
@Table(name = "ristorante")
@NamedQuery(name = "Ristorante.findAll", query = "SELECT r FROM Ristorante r")
@NamedQuery(name = "Ristorante.findByIdTipoCucina", query = "SELECT DISTINCT r FROM Ristorante r INNER JOIN r.tipiCucina tc WHERE tc.idTipoCucina = :idTipoCucina")
public class Ristorante implements Serializable {
    private static final long serialVersionUID = 1L;    

    @Id
    @Column(name = "idRistorante", nullable = false, unique = true, insertable = false, updatable = false)
    private int idRistorante;    

    private String nome;    

    private String indirizzo;    

    private String numeroTelefonico;    

    private String orario;    

    private float costoDiConsegna;    

    private float ordineMinimo;    

    private String linkSito;    

    // bi-directional many-to-one association to Ordine
    @OneToMany(mappedBy = "ristorante")
    private List<Ordine> ordini;    

    // bi-directional many-to-many association to Portata
    @ManyToMany
    @JoinTable(name = "ristorante_portata", joinColumns = {
            @JoinColumn(name = "IdRistorante", referencedColumnName = "IdRistorante") }, inverseJoinColumns = {
                    @JoinColumn(name = "IdPortata", referencedColumnName = "IdPortata") })
    private List<Portata> portate;    

    // bi-directional many-to-many association to TipoCucina
    @ManyToMany
    @JoinTable(name = "ristorante_tipo_cucina", joinColumns = {
            @JoinColumn(name = "IdRistorante", referencedColumnName = "IdRistorante") }, inverseJoinColumns = {
                    @JoinColumn(name = "IdTipoCucina", referencedColumnName = "IdTipoCucina") })
    private List<TipoCucina> tipiCucina;    

    public Ristorante() {
    }    

    public Ristorante(String nome, String indirizzo, String numeroTelefonico, String orario, float costoDiConsegna,
            float ordineMinimo, String linkSito) {
        super();
        this.nome = nome;
        this.indirizzo = indirizzo;
        this.numeroTelefonico = numeroTelefonico;
        this.orario = orario;
        this.costoDiConsegna = costoDiConsegna;
        this.ordineMinimo = ordineMinimo;
        this.linkSito = linkSito;
    }    

    public Ristorante(int idRistorante, String nome, String indirizzo, String numeroTelefonico, String orario,
            float costoDiConsegna, float ordineMinimo, String linkSito) {
        super();
        this.idRistorante = idRistorante;
        this.nome = nome;
        this.indirizzo = indirizzo;
        this.numeroTelefonico = numeroTelefonico;
        this.orario = orario;
        this.costoDiConsegna = costoDiConsegna;
        this.ordineMinimo = ordineMinimo;
        this.linkSito = linkSito;
    }    

    public int getIdRistorante() {
        return idRistorante;
    }    

    public void setIdRistorante(int idRistorante) {
        this.idRistorante = idRistorante;
    }    

    public float getCostoDiConsegna() {
        return this.costoDiConsegna;
    }    

    public void setCostoDiConsegna(float costoDiConsegna) {
        this.costoDiConsegna = costoDiConsegna;
    }    

    public String getIndirizzo() {
        return this.indirizzo;
    }    

    public void setIndirizzo(String indirizzo) {
        this.indirizzo = indirizzo;
    }    

    public String getLinkSito() {
        return this.linkSito;
    }    

    public void setLinkSito(String linkSito) {
        this.linkSito = linkSito;
    }    

    public String getNome() {
        return this.nome;
    }    

    public void setNome(String nome) {
        this.nome = nome;
    }    

    public String getNumeroTelefonico() {
        return this.numeroTelefonico;
    }    

    public void setNumeroTelefonico(String numeroTelefonico) {
        this.numeroTelefonico = numeroTelefonico;
    }    

    public String getOrario() {
        return this.orario;
    }    

    public void setOrario(String orario) {
        this.orario = orario;
    }    

    public float getOrdineMinimo() {
        return this.ordineMinimo;
    }    

    public void setOrdineMinimo(float ordineMinimo) {
        this.ordineMinimo = ordineMinimo;
    }    

    public List<Ordine> getOrdini() {
        return this.ordini;
    }    

    public void setOrdini(List<Ordine> ordini) {
        this.ordini = ordini;
    }    

    public Ordine addOrdine(Ordine ordine) {
        getOrdini().add(ordine);
        ordine.setRistorante(this);    

        return ordine;
    }    

    public Ordine removeOrdine(Ordine ordine) {
        getOrdini().remove(ordine);
        ordine.setRistorante(null);    

        return ordine;
    }    

    public List<Portata> getPortate() {
        return this.portate;
    }    

    public void setPortate(List<Portata> portate) {
        this.portate = portate;
    }    

    public List<TipoCucina> getTipiCucina() {
        return this.tipiCucina;
    }    

    public void setTipiCucina(List<TipoCucina> tipiCucina) {
        this.tipiCucina = tipiCucina;
    }
}

TipoCucina.java

package gnammy.entities;    

import java.io.Serializable;
import java.util.List;    

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.NamedQuery;
import javax.persistence.Table;    

/**
 * The persistent class for the tipo_cucina database table.
 * 
 */
@Entity
@Table(name = "tipo_cucina")
@NamedQuery(name = "TipoCucina.findAll", query = "SELECT t FROM TipoCucina t")
public class TipoCucina implements Serializable {
    private static final long serialVersionUID = 1L;    

    @Id
    @Column(name = "idTipoCucina", nullable = false, unique = true, insertable = false, updatable = false)
    private int idTipoCucina;    

    private String descrizione;    

    private String immagine;    

    // bi-directional many-to-many association to Ristorante
    @ManyToMany(mappedBy = "tipiCucina")
    private List<Ristorante> ristoranti;    

    public TipoCucina() {
    }    

    public TipoCucina(String descrizione, String immagine) {
        super();
        this.descrizione = descrizione;
        this.immagine = immagine;
    }    

    public TipoCucina(int idTipoCucina, String descrizione, String immagine) {
        super();
        this.idTipoCucina = idTipoCucina;
        this.descrizione = descrizione;
        this.immagine = immagine;
    }    

    public int getIdTipoCucina() {
        return idTipoCucina;
    }    

    public void setIdTipoCucina(int idTipoCucina) {
        this.idTipoCucina = idTipoCucina;
    }    

    public String getDescrizione() {
        return this.descrizione;
    }    

    public void setDescrizione(String descrizione) {
        this.descrizione = descrizione;
    }    

    public String getImmagine() {
        return this.immagine;
    }    

    public void setImmagine(String immagine) {
        this.immagine = immagine;
    }    

    public List<Ristorante> getRistorantes() {
        return this.ristoranti;
    }    

    public void setRistorantes(List<Ristorante> ristorantes) {
        this.ristoranti = ristorantes;
    }
}

我错过了什么?

1 个答案:

答案 0 :(得分:1)

从堆栈跟踪中可以明显看出,spring jpa正在错误地转换您的列名。

java.sql.SQLSyntaxErrorException: Unknown column 'ristorante0_.id_ristorante' in 'field list'
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120) ~[mysql-connector-java-8.0.15.jar:8.0.15]
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) ~[mysql-connector-java-8.0.15.jar:8.0.15]
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ~[mysql-connector-java-8.0.15.jar:8.0.15]
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:970) ~[mysql-connector-java-8.0.15.jar:8.0.15]
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeQuery(ClientPreparedStatement.java:1020) ~[mysql-connector-java-8.0.15.jar:8.0.15]
    at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeQuery(ProxyPreparedStatement.java:52) ~[HikariCP-3.3.1.jar:na]
    at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeQuery(HikariProxyPreparedStatement.java) ~[HikariCP-3.3.1.jar:na]
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:60) ~[hibernate-core-5.4.2.Final.jar:5.4.2.Final]
    at org.hibernate.loader.Loader.getResultSet(Loader.java:2173) ~[hibernate-core-5.4.2.Final.jar:5.4.2.Final]
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1936) ~[hibernate-core-5.4.2.Final.jar:5.4.2.Final]
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1898) ~[hibernate-core-5.4.2.Final.jar:5.4.2.Final]
    at org.hibernate.loader.Loader.doQuery(Loader.java:937) ~[hibernate-core-5.4.2.Final.jar:5.4.2.Final]
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:340) ~[hibernate-core-5.4.2.Final.jar:5.4.2.Final]
    at org.hibernate.loader.Loader.doList(Loader.java:2695) ~[hibernate-core-5.4.2.Final.jar:5.4.2.Final]
    at org.hibernate.loader.Loader.doList(Loader.java:2678) ~[hibernate-core-5.4.2.Final.jar:5.4.2.Final]
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2512) ~[hibernate-core-5.4.2.Final.jar:5.4.2.Final]
    at org.hibernate.loader.Loader.list(Loader.java:2507) ~[hibernate-core-5.4.2.Final.jar:5.4.2.Final]
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:504) ~[hibernate-core-5.4.2.Final.jar:5.4.2.Final]
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:396) ~[hibernate-core-5.4.2.Final.jar:5.4.2.Final]
    at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:224) ~[hibernate-core-5.4.2.Final.jar:5.4.2.Final]
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1538) ~[hibernate-core-5.4.2.Final.jar:5.4.2.Final]
    at org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1561) ~[hibernate-core-5.4.2.Final.jar:5.4.2.Final]
    at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1529) ~[hibernate-core-5.4.2.Final.jar:5.4.2.Final]
    at org.hibernate.query.Query.getResultList(Query.java:165) ~[hibernate-core-5.4.2.Final.jar:5.4.2.Final]
    at gnammy.repositories.RistoranteRepositoryImpl.listaRistoranti(RistoranteRepositoryImpl.java:54) ~[classes/:na]

在尝试执行实体类Ristorante上的方法 listaRistoranti(RistoranteRepositoryImpl.java:54)的堆栈跟踪中,jpa转换为@Column(name = "idRistorante")的列名骆驼案id_ristorante的原因,而在数据库中列名本身就是idRistorante,这就是造成问题的原因。

来自Spring data access howto guides配置休眠命名策略部分:

  

休眠使用两种不同的命名策略将对象模型中的名称映射到相应的数据库名称。可以分别通过设置spring.jpa.hibernate.naming.physical-strategy and spring.jpa.hibernate.naming.implicit-strategy properties来配置物理和隐式策略实现的完全限定的类名。另外,如果在应用程序上下文中有 ImplicitNamingStrategy PhysicalNamingStrategy Bean,则Hibernate将自动配置为使用它们。

     

默认情况下,Spring Boot使用以下命令配置物理命名策略:   SpringPhysicalNamingStrategy。该实现提供了相同的   Hibernate 4的表结构:下划线替换所有点   骆驼肠衣也被下划线代替。默认情况下,所有   表名以小写形式生成,但是可以   如果您的模式需要,请覆盖该标志。

尝试在application.propertiesapplication.yml中使用以下属性,以使spring jpa不会转换您的列名并使用您在Entity中指定的名称。

Application.yml

spring:
  jpa:
    hibernate:
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
        implicit-strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl