文章目录
一、问题描述
问题一:在如下的SQL语句中<=报应为【标记名称】导致
问题二:当bsr.clean_seat_time
为NULL时取当前时间
xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zhoqua.mapper.BcSeatRecordDao">
<select id="demo" resultType="com.zhoqua.domain.entity.BcOrders">
SELECT bo.*
FROM bc_seat_record bsr
JOIN bc_cart bc ON bsr.`seat_id` = bc.`seat_id` AND bc.`status` = 1
JOIN bc_orders bo
ON bc.`order_code` = bo.`order_code` AND bo.`create_time` >= bsr.`create_time`
AND bo.`create_time` <= bsr.`clean_seat_time`
WHERE bsr.`id` = #{seatRecordId}
AND bsr.del_flag = 0
AND bc.del_flag = 0
AND bo.del_flag = 0
GROUP BY bo.`order_code`
</select>
</mapper>
二、问题处理
2.1 问题一处理
在XML 文件中,<=
是 MyBatis 中的 XML 标签名称,而不是实际的 SQL 运算符。MyBatis 使用 XML 标签来定义 SQL 查询语句和其他映射配置。
如果想在 XML 中使用实际的 SQL 运算符 <=
,可以将它放在 CDATA 区块中,如下所示:
xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zhoqua.mapper.BcSeatRecordDao">
<select id="demo" resultType="com.zhoqua.domain.entity.BcOrders">
<![CDATA[
SELECT bo.*
FROM bc_seat_record bsr
JOIN bc_cart bc ON bsr.`seat_id` = bc.`seat_id` AND bc.`status` = 1
JOIN bc_orders bo
ON bc.`order_code` = bo.`order_code` AND bo.`create_time` >= bsr.`create_time`
AND bo.`create_time` <= bsr.`clean_seat_time`
WHERE bsr.`id` = #{seatRecordId}
AND bsr.del_flag = 0
AND bc.del_flag = 0
AND bo.del_flag = 0
GROUP BY bo.`order_code`
]]>
</select>
</mapper>
CDATA 区块中的文本不会被 XML 解析器解析,因此可以包含任意的字符和运算符,而不会引起 XML 解析错误。这样,就可以在 XML 中使用实际的 SQL 运算符 <=
。
2.2 问题二处理
要在 SQL 查询中处理 bsr.clean_seat_time
为空时取当前时间的情况,可以使用 COALESCE
函数或 IFNULL
函数来处理。这些函数可以用于返回第一个非空的参数。
示例:
xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zhoqua.mapper.BcSeatRecordDao">
<select id="demo" resultType="com.zhoqua.domain.entity.BcOrders">
<![CDATA[
SELECT bo.*
FROM bc_seat_record bsr
JOIN bc_cart bc ON bsr.`seat_id` = bc.`seat_id` AND bc.`status` = 1
JOIN bc_orders bo
ON bc.`order_code` = bo.`order_code` AND bo.`create_time` >= bsr.`create_time`
AND bo.`create_time` <= COALESCE(bsr.`clean_seat_time`, NOW())
WHERE bsr.`id` = #{seatRecordId}
AND bsr.del_flag = 0
AND bc.del_flag = 0
AND bo.del_flag = 0
GROUP BY bo.`order_code`
]]>
</select>
</mapper>
使用 COALESCE
函数将 bsr.clean_seat_time
和当前时间通过参数传递给 COALESCE
函数。如果 bsr.clean_seat_time
为空,则 COALESCE
函数会返回当前时间 NOW()
。这样可以确保在 bo.create_time <= bsr.clean_seat_time
中进行比较时,如果 bsr.clean_seat_time
为空,会使用当前时间进行比较。需要注意 ,NOW()
函数的结果可能与数据库系统有关。如果使用的是不同的数据库,可能需要使用该数据库系统的特定函数来获取当前时间。