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

Posted

技术标签:

【中文标题】如何修复“java.sql.SQLSyntaxErrorException:\'字段列表\'中的未知列\'product0_.return_policy\'”异常?【英文标题】: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 【参考方案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

【讨论】:

以上是关于如何修复“java.sql.SQLSyntaxErrorException:'字段列表'中的未知列'product0_.return_policy'”异常?的主要内容,如果未能解决你的问题,请参考以下文章

如何修复drv?

如何修复漏洞

如何修复WMI

PHP网站漏洞怎么修复 如何修补网站程序代码漏洞

如何修复这些漏洞? (npm audit fix 无法修复这些漏洞)

如何修复AppScan漏洞