为什么"无法提取结果集"发生错误?

时间:2017-11-30 17:24:03

标签: hibernate

我想通过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页面

2 个答案:

答案 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;
}