【问题标题】:Error org.hibernate.exception.SQLGrammarException: could not extract ResultSet错误 org.hibernate.exception.SQLGrammarException:无法提取 ResultSet
【发布时间】:2019-02-04 10:31:40
【问题描述】:

我有我正在执行的 hql 查询,但收到一个我不太了解原因的错误。

这是我的代码:

@Override
public List<StaffRequest> getStaffLeaveRequest(String userID, Date startDate, Date endDate) 
{
    Session currentSession = sessionFactory.getCurrentSession();        

    List<StaffRequest> results = 
    currentSession.createQuery("select new com.timesheet_Webservice.CustomEntity.StaffRequest(lr.leave_ID, lr.leave_Employee, concat(s.staff_First_Name, ' ', s.staff_Last_Name), "
            + "(lr.leave_Days*8.5), lr.leave_Comments, '1805', concat(pro.project_Pastel_Prefix, ' - ', pro.project_Description), lr.leave_Start, lr.leave_End, lr.leave_IsApproved, "
            + "(select lt.leaveType_Description from LeaveType lt where lt.leaveType_ID = lr.leave_Type)) "
            + "from Staff s, Project pro, Leave lr "
            + "where lr.leave_Employee = s.staff_Code and pro.project_Code = 1805 and lr.leave_Approved = :userID and lr.leave_IsApproved = 0 and s.staff_IsEmployee <> 0 "
            + "and lr.leave_Start between :startDate and :endDate "
            + "order by concat(s.staff_First_Name, ' ', s.staff_Last_Name)")
            .setParameter("userID",userID).setParameter("startDate", startDate).setParameter("endDate", endDate).getResultList();   

    return results;
}

我在尝试执行时在网页上收到此错误:

org.hibernate.exception.SQLGrammarException:无法提取 结果集

还有这个控制台错误:

错误:您的 SQL 语法有错误;检查手册 对应于您的 MariaDB 服务器版本,以便使用正确的语法 '离开 leave2_ 附近,其中 leave2_.Leave_Employee=staff0_.Staff_Code 和第 1 行的 project1_.Proj'

这似乎表明 where 子句有一些错误,但我没有看到任何特别错误的地方。

更新: 实体类

项目

@Entity
@Table(name="project")
public class Project {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="Project_Code")
    public int project_Code;

    @Column(name="Project_Customer")
    public int project_Customer;

    //A lot more attributes...

}

员工

@Entity
@Table(name="staff")
public class Staff 
{
    @Id
    @Column(name="Staff_Code")
    public String staff_Code;
    ...
}

【问题讨论】:

  • 添加Staff、Project pro、离开实体类
  • 我确实有所有 3 个实体类
  • 太好了。我们能看到他们吗
  • 抱歉,您的意思是我应该创建它们。已添加。

标签: java hibernate hql


【解决方案1】:

1) 当您将java.util.Date 用于Leave.leave_Start 时,您应该使用正确的@Temporal 值进行注释:

@Temporal(TemporalType.TIMESTAMP)
@Column(name="Leave_Start")
Date leave_Start;

2) 设置查询日期参数时,请尝试使用:

.setDate("startDate", startDate)

.setParameter("startDate", startDate, TemporalType.TIMESTAMP)

【讨论】:

  • 按照您的建议进行操作,但不幸的是错误仍然存​​在。通过一些额外的测试,我通过删除其他 where 条件将错误的原因缩小到“from Leave lr”。如果我在工作台中运行此查询的 SQL 端口,它会完美运行。
  • 应该大写吗?
  • 如果你的意思是表名,那么它应该是小写的,但我也已经修复了这个问题,但这个顽固的错误仍然存​​在。可能只需要使用本机查询
  • 我尝试了一个非常简单的“从离开”查询并得到了同样的错误,所以我的实体类一定有问题
【解决方案2】:

好的,经过多次测试,我发现了错误的原因。由于某些未知原因,查询似乎与引用表“离开”的名称有问题,并且每当我尝试从中检索数据时都会产生错误。但是,如果我将表重命名为“leaves”之类的简单名称,则查询将成功执行。有谁知道这是为什么?

【讨论】:

  • leave 是 MySQL 中的保留字,这就是它不起作用的原因。
【解决方案3】:

显然,JPA 遵循变量名称的一些规则或约定,不接受“_”,并且由于某种原因不接受中间大写字母......它通过将所有变量更改为小写来为我工作

【讨论】:

  • 无论如何都不能回答,应该是评论
猜你喜欢
  • 2015-08-03
  • 2018-10-04
  • 2015-07-22
  • 1970-01-01
  • 2017-11-22
  • 2019-08-06
  • 2018-02-04
  • 2016-09-28
相关资源
最近更新 更多