Mybatis语法bug
select *
from appointment
where status = ‘ACCEPTED’
and expire_time< now()
idea显示now()这里一直报错:
应为标记名称
应为=
Deepseek:
根据您的代码和报错信息分析,这是一个 MyBatis XML 文件中的 SQL 语法问题。具体原因及解决方案如下:
-
XML 特殊字符问题
< now()
中的小于号<
是 XML 保留字符,必须转义为<
,建议将条件改为:expire_time < now()
-
数据库函数兼容性建议
若使用 MySQL 数据库,推荐改用CURRENT_TIMESTAMP
替代now()
(功能相同但更符合 SQL 标准):expire_time < CURRENT_TIMESTAMP
-
CDATA 区块方案
对于含特殊字符的 SQL 片段,可用 CDATA 包裹避免转义:<![CDATA[ expire_time < CURRENT_TIMESTAMP ]]>
-
完整修正示例
<select id="getTimeoutAppointments" resultType="cn.edu.hactcm.vitallink.entity.user.Appointment"> SELECT * FROM appointment WHERE status = 'ACCEPTED' AND expire_time < CURRENT_TIMESTAMP </select>
补充说明:若使用 Oracle 数据库需改用 SYSDATE
,PostgreSQL 建议使用 CURRENT_TIMESTAMP
。建议检查数据库类型并统一时间函数的使用规范。