java.sql.SQLSyntaxErrorException:未知列 .JPA 实体问题?
java.sql.SQLSyntaxErrorException: Unknown column .JPA Entity Issue?
当我尝试向我的 Spring 引导应用程序发送 GET 请求时,我有这个 error,但我不知道我错过了什么!
我有这个 database 并且我在 Eclipse 中创建了 JPA 实体 和关系,并为我的 [ 安装了 STS(Spring 工具套件) =55=] 引导项目,相应地。
创建的实体是:
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;
}
}
我错过了什么???
从堆栈跟踪可以看出,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]
在尝试对实体 class Ristorante
执行方法 listaRistoranti(RistoranteRepositoryImpl.java:54) 时在堆栈跟踪中,jpa将作为 @Column(name = "idRistorante")
给出的列名转换为驼峰式大小写 id_ristorante
,而在数据库中,列名是 idRistorante
本身,这导致了问题。
来自Spring data access howto guides的配置Hibernate命名策略部分:
Hibernate uses two different naming strategies to map names from the object model to the corresponding database names. The fully qualified class name of the physical and the implicit strategy implementations can be configured by setting the spring.jpa.hibernate.naming.physical-strategy and spring.jpa.hibernate.naming.implicit-strategy properties
, respectively. Alternatively, if ImplicitNamingStrategy or PhysicalNamingStrategy beans are available in the application context, Hibernate will be automatically configured to use them.
By default, Spring Boot configures the physical naming strategy with
SpringPhysicalNamingStrategy. This implementation provides the same
table structure as Hibernate 4: all dots are replaced by underscores
and camel casing is replaced by underscores as well. By default, all
table names are generated in lower case, but it is possible to
override that flag if your schema requires it.
尝试在 application.properties
或 application.yml
中使用以下 属性 ,无论您使用哪个,这样 spring jpa 就不会转换您的列名并将其用作它在您的实体中指定。
Application.yml
spring:
jpa:
hibernate:
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
implicit-strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
当我尝试向我的 Spring 引导应用程序发送 GET 请求时,我有这个 error,但我不知道我错过了什么!
我有这个 database 并且我在 Eclipse 中创建了 JPA 实体 和关系,并为我的 [ 安装了 STS(Spring 工具套件) =55=] 引导项目,相应地。
创建的实体是:
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;
}
}
我错过了什么???
从堆栈跟踪可以看出,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]
在尝试对实体 class Ristorante
执行方法 listaRistoranti(RistoranteRepositoryImpl.java:54) 时在堆栈跟踪中,jpa将作为 @Column(name = "idRistorante")
给出的列名转换为驼峰式大小写 id_ristorante
,而在数据库中,列名是 idRistorante
本身,这导致了问题。
来自Spring data access howto guides的配置Hibernate命名策略部分:
Hibernate uses two different naming strategies to map names from the object model to the corresponding database names. The fully qualified class name of the physical and the implicit strategy implementations can be configured by setting the
spring.jpa.hibernate.naming.physical-strategy and spring.jpa.hibernate.naming.implicit-strategy properties
, respectively. Alternatively, if ImplicitNamingStrategy or PhysicalNamingStrategy beans are available in the application context, Hibernate will be automatically configured to use them.By default, Spring Boot configures the physical naming strategy with SpringPhysicalNamingStrategy. This implementation provides the same table structure as Hibernate 4: all dots are replaced by underscores and camel casing is replaced by underscores as well. By default, all table names are generated in lower case, but it is possible to override that flag if your schema requires it.
尝试在 application.properties
或 application.yml
中使用以下 属性 ,无论您使用哪个,这样 spring jpa 就不会转换您的列名并将其用作它在您的实体中指定。
Application.yml
spring:
jpa:
hibernate:
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
implicit-strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl