【问题标题】:How to fix "java.sql.SQLSyntaxErrorException: Unknown column 'product0_.return_policy' in 'field list' " exception?如何修复“java.sql.SQLSyntaxErrorException:'字段列表'中的未知列'product0_.return_policy'”异常?
【发布时间】:2019-08-17 19:43:12
【问题描述】:

当我尝试在我的浏览器上运行 URL 以 GET 所有 产品时,我得到了这个“SQLSyntaxErrorException:Unknown column 'product0_.return_policy' in 'field list'” .

Look here

浏览器也显示如下:

出现意外错误(类型=内部服务器错误,状态=500)。 无法提取结果集; SQL [不适用];嵌套异常是 org.hibernate.exception.SQLGrammarException: could not extract ResultSet

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

这是 getAllProducts 方法,它是 RESTController 的一部分:

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

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

This是MySQL表的描述:

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;

产品存储库

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

SQL tinyint(Boolean)与Java的Boolean类型的映射是否有问题?

【问题讨论】:

  • 我是新手,如果这是一个小问题请见谅
  • 非常适合新手的问题。
  • 哈哈谢谢。这是我的第一个问题:P

标签: java mysql database spring-boot


【解决方案1】:

您的returnPolicy 未与return_policy 列映射,您可以通过以下方式快速解决此问题

方法1

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;

方法2

@JsonNaming 注释是管理命名策略,它应该从实体字段名称派生出什么列名。

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;

@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
@JsonIgnoreProperties(ignoreUnknown = true)
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;

【讨论】:

  • 我在发布问题之前尝试了方法 1。它对我不起作用
  • 使用第二种方法,如果仍然遇到同样的问题,请发布您的存储库代码
  • 第二种方法也没有任何区别。将 sql 中的列重命名为 return_policy 是可行的。这是存储库类:@Repository public interface ProductRepository extends JpaRepository&lt;Product, String&gt;{ }这是我的服务类中的代码:@Autowired private ProductRepository productRepository; public List&lt;Product&gt; getAllProducts() { return productRepository.findAll(); }
  • 从模型中删除@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class),然后重新开始
【解决方案2】:

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

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

或者,对于这个特定问题,使用明确的列名注释字段将是可以理解的。

更多信息请参见this SO 回答。

【讨论】:

  • 具体来说,带有注释:@Column(name="returnPolicy") Boolean returnPolicy; 或简单的Boolean returnpolicy;(丑陋)
  • 谢谢!将列重命名为“return_policy”对我有用。
  • 使用 @Column(name="returnPolicy") 没有区别(不知道为什么)。事实上,我在这里发布问题之前也尝试过
【解决方案3】:

如果你不使用属性作为数据库中的列,你可以使用这个注解@Transient

JPA 或 Hibernate 中的@Transient 注释用于指示字段不被持久化或忽略字段以保存在数据库中。 @Transient 存在于 javax 中。持久性包。它用于注释实体类、映射超类或可嵌入类的属性或字段。

你可以这样使用它。

@Transient
    private String token;

【讨论】:

    【解决方案4】:

    默认情况下,Hibernate 会将驼峰式字母转换为下划线。因此,您要么更改表中的列以反映这一点,要么更改休眠命名策略。 在 application.properties 文件中添加以下内容:

    spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-02
      • 2020-11-22
      • 2021-11-30
      • 2020-01-22
      • 2017-10-03
      • 2021-01-03
      • 1970-01-01
      相关资源
      最近更新 更多