如何修复“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<Product, String>
这是我的服务类中的代码:@Autowired private ProductRepository productRepository; public List<Product> 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'”异常?的主要内容,如果未能解决你的问题,请参考以下文章