当我尝试在浏览器中运行URL来 GET 所有产品时,我一直收到此“ SQLSyntaxErrorException:“字段列表”中的未知列“ product0_.return_policy”” 。
浏览器也会显示以下内容:
发生意外错误(类型=内部服务器错误,状态= 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;
@Repository public interface ProductRepository extends JpaRepository<Product, String>{ }
SQL tinyint(Boolean)与Java的Boolean类型之间的映射是否存在问题?
答案 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
映射,您可以通过以下
return_policy
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
@Transient
批注用于指示不保留字段或忽略要保存在数据库中的字段。 @Transient
存在于javax中。持久性软件包。它用于注释实体类,映射超类或可嵌入类的属性或字段。
您可以通过这种方式使用它。
@Transient
private String token;