HQL查询出现Unknown column 'email'异常,请求技术支持
解决MySQLSyntaxErrorException: Unknown column 'email' in 'where clause'问题
这个错误的根源很明确:你混淆了HQL的实体类属性名和数据库表的列名。
问题分析
你写的HQL语句是:
String hql="from "+ Employee.class.getName() + " where email= ? and password=? ";
但Hibernate生成的SQL里,where子句变成了where email=? and employee0_.emppassword=?——注意这里的email直接被当成了数据库列名,但你的数据库表emptab里实际存储邮箱的列是empmail(从生成的SQL里employee0_.empmail as empmail0_能看出来),所以MySQL自然找不到email这个列,抛出了语法错误。
HQL是面向实体类的查询语言,它需要使用实体类的属性名,而不是数据库的列名。你现在的HQL里写的email要么是实体类里不存在的属性,要么是实体类属性没有正确映射到数据库列。
解决方案
根据你的场景,有两种修正方式:
方式1:修正HQL,使用实体类的正确属性名
从生成的SQL来看,你的Employee实体类中,对应邮箱的属性应该是empmail,对应密码的属性是emppassword。所以把HQL改成:
String hql="from "+ Employee.class.getName() + " where empmail= ? and emppassword=? ";
这样Hibernate会正确将empmail映射到数据库的empmail列,生成的SQL就不会出现不存在的email列了。
方式2:调整实体类的映射,让属性名email对应数据库列empmail
如果你更希望在HQL里用email这个属性名,可以修改Employee实体类的字段映射,比如用JPA注解:
@Entity @Table(name = "emptab") public class Employee { // 其他属性... @Column(name = "empmail") // 指定该属性对应数据库的empmail列 private String email; @Column(name = "emppassword") private String password; // Getter和Setter... }
这样你的原HQL语句就可以正常工作,Hibernate会自动把email属性转换为数据库的empmail列。
验证
修改后再执行代码,Hibernate生成的SQL应该会变成:
select employee0_.empid as empid0_, employee0_.empmail as empmail0_, employee0_.empmobile as empmobile0_, employee0_.empname as empname0_, employee0_.emppassword as emppassw5_0_ from emptab employee0_ where employee0_.empmail=? and employee0_.emppassword=?
这时候where子句里的列名都是数据库存在的,就不会再报错了。
内容的提问来源于stack exchange,提问作者abhinai raj
相关产品推荐
相关产品推荐

