如何解决"java.sql.SQLSyntaxErrorException: Unknown column 'product0_.return_policy' in 'field list'



当我尝试在浏览器上运行URL以获取所有产品时,我一直收到"SQLSyntaxErrorException:'字段列表'中的未知列'product0_.return_policy'"。

看这里

浏览器还显示以下内容:

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

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

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

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

当我完全删除返回策略变量时,它工作正常。

这是 MySQL 表的描述:

返回策略列中存储的值:

退货政策

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(布尔值)和布尔类型的Java之间的映射有问题吗?

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

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

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

请参阅此SO答案以获取更多信息。

您的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;

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

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

你可以这样使用它。

@Transient
private String token;

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

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

相关内容

最新更新