我想通过id从数据库中获取记录。您可以在下面看到我的查询:
public StudentEntity getStudentById(int id) {
Session session = sessionFactory.openSession();
Query query = session.createQuery("from StudentEntity where idstudent = :id").setParameter("id", id);
StudentEntity studentEntity = (StudentEntity) query.uniqueResult();
session.close();
return studentEntity;
}
我的StudentEntity课程,您可以看到here
我的堆栈跟踪您可以看到here 和其他表格一样,我没有收到这样的错误。这就是为什么我认为错误发生在StudentEntity类中的原因。这个错误可能是什么原因?我该如何解决?项目here
的Github页面答案 0 :(得分:2)
答:堆栈跟踪显示MySQL正在返回错误1064
You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version
for the right syntax to use near
'as docExpir4_3_, studentent0_.docIssueOrgnazation as docIssue5_3_, studentent0_.'
at line 1
这意味着Hibernate试图准备或执行MySQL无法理解的SQL语句。有某种语法错误。我们将排除使用保留字作为列名,因为Hibernate应该在SELECT语句中限定列引用。我认为我们可以排除无效的列引用,因为MySQL会为该条件返回不同的错误(1054)。
问:我该如何解决?
答:捕获正在执行的SQL。
为Hibernate启用DEBUG或TRACE,因此它会在log4j配置中记录它正在执行的SQL语句
log4j.logger.org.hibernate.SQL=DEBUG
log4j.logger.org.hibernate.type=TRACE
学习如何调试你编写的程序是无可替代的。
话虽如此,需要正确转义包含空格的MySQL列名。例如,如果我们执行此SQL语句:
SELECT foo.fee fi AS fo FROM fum foo
MySQL服务器抛出1064语法错误" near 'AS fo '
"
如果我们将列名称用反引号字符括起来,我们就不会出现语法错误。
SELECT foo.`fee fi` AS fo FROM fum foo
^ ^
使用Hibernate本机API,我们可以将列名称包含在单个反引号中。
@Column(name = "`fee fi`")
使用JPA,我们可以用双引号括起来
@Column(name = "\"fee fi\"")
答案 1 :(得分:1)
堆栈跟踪的原因
'as docExpir4_3_, studentent0_.docIssueOrgnazation as docIssue5_3_, studentent0_.'
其中一列没有名称studentent0_.
。请检查StudentEntity
课程。
至少这是不正确的
@Column(name = "Payment type", nullable = true, length = 45)
public String getPaymentType() {
return paymentType;
}
@Column(name = "docExpire time", nullable = true)
public Date getDocExpireTime() {
return docExpireTime;
}