java.sql.SQLSyntaxErrorException: Unknown column in 'field list'
java.sql.SQLSyntaxErrorException: Unknown column in 'field list'
我正在尝试使用Hibernate处理OneToMany关系。我正在使用@Temporal注解来告诉Hibernate关于Data字段。我不确定为什么会出现这个错误。看起来与日期格式有问题。请告诉我如何解决它。
Customer
package regular; import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToMany; @Entity public class Customers { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int customer_id; private String customerName; private String contactName; private String address; private String city; private String postalCode; private String country; @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true) @JoinColumn(name = "customer_id") private Listorder; public Customers() { } public List getOrder() { return order; } public void setOrder(List order) { this.order = order; } public Customers(String customerName, String contactName, String address, String city, String postalCode, String country, List order) { this.customerName = customerName; this.contactName = contactName; this.address = address; this.city = city; this.postalCode = postalCode; this.country = country; this.order = order; } public String getCustomerName() { return customerName; } public void setCustomerName(String customerName) { this.customerName = customerName; } public String getContactName() { return contactName; } public void setContactName(String contactName) { this.contactName = contactName; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getPostalCode() { return postalCode; } public void setPostalCode(String postalCode) { this.postalCode = postalCode; } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } public int getCustomer_id() { return customer_id; } @Override public String toString() { return "Customers [customer_id=" + customer_id + ", customerName=" + customerName + ", contactName=" + contactName + ", address=" + address + ", city=" + city + ", postalCode=" + postalCode + ", country=" + country + ", order=" + order + "]"; } }
Orders
package regular; import java.util.Date; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Temporal; import javax.persistence.TemporalType; @Entity public class Orders { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int orderId; @Temporal(value = TemporalType.TIMESTAMP) private Date orderDate; private String productName; private int quantity; public Orders(String productName, int quantity) { this.orderDate = new Date(); this.productName = productName; this.quantity = quantity; } public Orders() { } public Date getOrderDate() { return orderDate; } public void setOrderDate(Date orderDate) { this.orderDate = orderDate; } public String getProductName() { return productName; } public void setProductName(String productName) { this.productName = productName; } public int getQuantity() { return quantity; } public void setQuantity(int quantity) { this.quantity = quantity; } public int getOrderId() { return orderId; } @Override public String toString() { return "Orders [orderId=" + orderId + ", orderDate=" + orderDate + ", productName=" + productName + ", quantity=" + quantity + "]"; } }
Runner
package regular; import java.util.ArrayList; import java.util.List; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class Runner { public static void main(String[] args) { SessionFactory sessionFactory = new Configuration().configure("/regular/hibernate.cfg.xml") .addAnnotatedClass(Customers.class).addAnnotatedClass(Orders.class).buildSessionFactory(); Session session = sessionFactory.openSession(); session.beginTransaction(); Customers customer = new Customers(); customer.setCustomerName("Robert Bosch"); customer.setAddress("404 California Ave"); customer.setCity("California"); customer.setPostalCode("60466"); customer.setCountry("USA"); Listorders = new ArrayList<>(); orders.add(new Orders("Car", 4)); orders.add(new Orders("Headphones", 6)); customer.setOrder(orders); session.save(customer); session.close(); } }
Error
Caused by: java.sql.SQLSyntaxErrorException: Unknown column 'orderDate' in 'field list' at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:686) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:663) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:653) at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:115) at com.mysql.cj.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2041) at com.mysql.cj.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1827) at com.mysql.cj.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2041) at com.mysql.cj.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:1977) at com.mysql.cj.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:4963) at com.mysql.cj.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1962) at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:204) ... 41 more
Hibernate默认将驼峰命名法转换为下划线命名法。因此,您可以更改表中的列以反映这一点,或者更改Hibernate的命名策略。
然而,有时候在使用Hibernate时,可能会遇到一个错误,错误消息为"java.sql.SQLSyntaxErrorException: Unknown column in 'field list'"。这个错误通常是由于数据库表中的列名与Hibernate的默认命名策略不匹配导致的。
解决这个问题的方法有两种:
1. 更改数据库表的列名:根据Hibernate的默认命名策略,将表中的列名改为下划线命名法。例如,如果您的表中有一个名为"myColumnName"的列,您可以将其改为"my_column_name"。这样,Hibernate将能够正确地与数据库交互,避免出现"Unknown column in 'field list'"错误。
2. 更改Hibernate的命名策略:如果您不想更改数据库表的列名,您可以选择更改Hibernate的命名策略。Hibernate提供了几种命名策略,您可以根据自己的需求选择适合的策略。例如,您可以使用"org.hibernate.cfg.DefaultComponentSafeNamingStrategy"来避免将驼峰命名法转换为下划线命名法。要更改命名策略,您可以在Hibernate配置文件中进行相应的配置。
无论您选择哪种方法,都需要确保数据库表的列名与Hibernate的命名策略保持一致,以避免出现"Unknown column in 'field list'"错误。这样,您就能够顺利地使用Hibernate进行数据操作了。
以上就是关于"java.sql.SQLSyntaxErrorException: Unknown column in 'field list'"问题的原因和解决方法的整理。希望能对您有所帮助。
在使用Hibernate和Spring Boot开发应用程序时,有些用户可能会遇到一个错误:java.sql.SQLSyntaxErrorException: Unknown column in 'field list'。这个错误的出现是由于字段命名策略引起的。
有一个相关的Stack Overflow链接(Hibernate field naming issue with Spring Boot (naming strategy))可以帮助解决这个问题。在这个链接中,建议在application.properties文件中添加以下内容:
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
这行代码的作用是将Hibernate的字段命名策略设置为PhysicalNamingStrategyStandardImpl。通过设置这个命名策略,可以解决Unknown column in 'field list'错误。
通过在application.properties文件中添加上述代码,可以解决这个错误,并确保Hibernate和Spring Boot应用程序能够正确处理字段命名策略。这个解决方法可以帮助开发人员避免在使用Hibernate和Spring Boot时遇到字段命名问题所导致的错误。