如何解决“ java.sql.SQLSyntaxErrorException:“字段列表”中的未知列“ product0_.return_policy””异常?

时间:2019-03-27 09:32:57

标签: java mysql database spring-boot

当我尝试在浏览器中运行URL来 GET 所有产品时,我一直收到此“ SQLSyntaxErrorException:“字段列表”中的未知列“ product0_.return_policy””

Look here

浏览器也会显示以下内容:

  

发生意外错误(类型=内部服务器错误,状态= 500)。   无法提取ResultSet; SQL [n / a];嵌套的异常是org.hibernate.exception.SQLGrammarException:无法提取ResultSet

returnPolicy 是导致此问题的唯一变量。当我同时从数据库和Java中的Product类中删除变量本身时,便能够从数据库中成功检索所有值。

这是RESTController一部分的 getAllProducts 方法:

@RequestMapping(method=RequestMethod.GET, value="/products")
    public List<Product> getAllProducts() {
        return productService.getAllProducts();
    }

当我完全删除returnPolicy变量时,效果很好。

This是MySQL表描述:

存储在returnPolicy列中的值:

  

returnPolicy

  0 
  0 
  1 
  1 
  1 

这是“产品”模型变量的代码:

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="product")
public class Product {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    private String name;
    private int price;
    private String vendor;
    private String description;
    private Boolean returnPolicy;

ProductRepository

@Repository public interface ProductRepository extends JpaRepository<Product, String>{ }

SQL tinyint(Boolean)与Java的Boolean类型之间的映射是否存在问题?

3 个答案:

答案 0 :(得分:4)

Hibernate假设实体字段returnPolicy对应于表列return_policy。但实际上,列名是returnPolicy

Hibernate遵循一种命名策略,即应从实体字段名称派生出哪个列名称。您应该明确指定使用ImplicitNamingStrategy还是PhysicalNamingStrategy。 Hibernate为此提供了开箱即用的类。

或者,对于此特定问题,使用显式列名注释字段将很容易理解。

有关更多信息,请参见this

答案 1 :(得分:0)

您的SqlCommand q = new SqlCommand("DELETE FROM tabStoreExec WHERE idSE =" + txtIDL.Text.ToString(), sqliteCon); //string q = "DELETE FROM tabStoreExec WHERE idSE =" + txtIDL.Text.ToString(); q.ExecuteNonQuery(); OR con.Open(); using (SqlCommand q= new SqlCommand("DELETE FROM tabStoreExec WHERE idSE =" + txtIDL.Text.ToString(), sqliteCon)) { q.ExecuteNonQuery(); } 未与列returnPolicy映射,您可以通过以下

快速修复此问题

方法1

return_policy

Method2

public class Product { @Id @GeneratedValue(strategy = GenerationType.AUTO) private int id; private String name; private int price; private String vendor; private String description; @Column(name = "return_policy") private Boolean returnPolicy; 注释是一种管理命名策略,它应从实体字段名称中派生出什么列名称。

@JsonNaming

答案 2 :(得分:0)

如果您不将属性用作数据库中的列,则可以使用此注释@Transient

JPA或Hibernate中的

@Transient批注用于指示不保留字段或忽略要保存在数据库中的字段。 @Transient存在于javax中。持久性软件包。它用于注释实体类,映射超类或可嵌入类的属性或字段。

您可以通过这种方式使用它。

@Transient
    private String token;