Hibernate SQL中LocalTime减Duration查询报错求修正
问题修正方案
错误原因
SQL执行顺序中,WHERE子句的解析早于SELECT子句,因此无法直接引用SELECT里定义的别名(如startTime1、endTime1),这是触发Could not interpret path expression 'aStartTime'异常的核心原因。
修正后的查询代码
将WHERE子句中引用别名的部分替换为对应的SUBTIME表达式即可,同时可以简化EXISTS子查询的返回字段(无需返回具体列,EXISTS仅判断存在性):
@Query( value = """ SELECT EXISTS ( SELECT 1 FROM appointment a WHERE a.date = ?1 AND ( (SUBTIME(a.startTime, a.mobileAdditionalDuration) < ?2 AND SUBTIME(a.endTime, a.mobileAdditionalDuration) > ?2) OR (SUBTIME(a.startTime, a.mobileAdditionalDuration) < ?3 AND SUBTIME(a.endTime, a.mobileAdditionalDuration) > ?3) ) ) """ ) fun checkIfAppointmentAlreadyExistAtThisTime(date: LocalDate, start: LocalTime, end: LocalTime): Boolean
额外注意事项
- 确保数据库支持
SUBTIME函数(如MySQL),如果使用其他数据库(如PostgreSQL),需替换为对应时间操作函数,例如PostgreSQL可使用a.startTime - a.mobileAdditionalDuration(需保证mobileAdditionalDuration存储为INTERVAL类型)。 - 确认
mobileAdditionalDuration字段在数据库中的存储类型与SUBTIME函数参数兼容,若映射为数值类型(如秒数),需先转换为时间间隔格式(例如MySQL中用SEC_TO_TIME(a.mobileAdditionalDuration))。
内容的提问来源于stack exchange,提问作者Iwan16
相关产品推荐
相关产品推荐

