错误 org.hibernate.exception.SQLGrammarException: 无法提取结果集
Error org.hibernate.exception.SQLGrammarException: could not extract ResultSet
我有我正在执行的 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: could not extract
ResultSet
还有这个控制台错误:
ERROR: You have an error in your SQL syntax; check the manual that
corresponds to your MariaDB server version for the right syntax to use
near 'Leave leave2_ where leave2_.Leave_Employee=staff0_.Staff_Code
and project1_.Proj' at line 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;
...
}
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)
好的,经过多次测试,我发现了错误的原因。由于某些未知原因,查询似乎对引用的 table 'leave' 的名称有问题,并且每当我尝试从中检索数据时都会产生错误。但是,如果我将 table 重命名为 'leaves' 这样简单的名称,则查询将成功执行。有人可能知道这是为什么吗?
显然 JPA 遵循变量名的一些规则或约定并且不接受“_”并且出于某种原因不接受中间大写字母...通过将所有变量更改为小写对我有用
我有我正在执行的 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: could not extract ResultSet
还有这个控制台错误:
ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'Leave leave2_ where leave2_.Leave_Employee=staff0_.Staff_Code and project1_.Proj' at line 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;
...
}
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)
好的,经过多次测试,我发现了错误的原因。由于某些未知原因,查询似乎对引用的 table 'leave' 的名称有问题,并且每当我尝试从中检索数据时都会产生错误。但是,如果我将 table 重命名为 'leaves' 这样简单的名称,则查询将成功执行。有人可能知道这是为什么吗?
显然 JPA 遵循变量名的一些规则或约定并且不接受“_”并且出于某种原因不接受中间大写字母...通过将所有变量更改为小写对我有用