错误org.hibernate.exception.SQLGrammarException:无法提取ResultSet

时间:2019-02-04 10:31:41

标签: java hibernate hql

我有正在执行的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服务器版本,以使用正确的语法   在'Leave Leave2_附近,其中Leave2_.Leave_Employee = staff0_.Staff_Code   和project1_.Proj'位于第1行

这似乎表明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;
    ...
}

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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