在使用 MyBatis-Plus 的 QueryWrapper 时,如果你需要对日期字段进行格式化或基于日期的条件查询(如忽略时间部分),你可以结合 SQL 函数和 QueryWrapper 提供的方法来实现。MyBatis-Plus 并没有直接提供日期格式化的注解或方法,但可以通过以下几种方式达成目标。
方法一:使用 SQL 函数
对于 MySQL、SQL Server 等数据库,可以利用数据库提供的函数(如 DATE()、CAST 或 CONVERT)来处理日期字段。你可以在 QueryWrapper 中通过 apply 方法应用这些函数。
示例(MySQL):
假设你有一个 Order 表,并且想要查询特定日期范围内的订单,同时忽略时间部分。
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public List getOrdersByDateRange(LocalDate startDate, LocalDate endDate) {
QueryWrapper queryWrapper = new QueryWrapper<>();
// 使用 apply 方法应用 SQL 函数
queryWrapper.apply("DATE(order_date) BETWEEN {0} AND {1}",
startDate.format(DateTimeFormatter.ISO_LOCAL_DATE),
endDate.format(DateTimeFormatter.ISO_LOCAL_DATE));
return orderMapper.selectList(queryWrapper);
}
对于 SQL Server,你可以使用 CAST 或 CONVERT 函数:
queryWrapper.apply("CAST(order_date AS DATE) BETWEEN {0} AND {1}",
startDate.format(DateTimeFormatter.ISO_LOCAL_DATE),
endDate.format(DateTimeFormatter.ISO_LOCAL_DATE));
方法二:使用 Lambda 表达式与 between 方法
如果你只需要比较日期而不需要格式化输出,可以直接使用 between 方法。这适用于你已经确保数据表中的日期字段只包含日期部分,或者你希望包括时间部分的精确匹配。
示例:
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
public List getOrdersByDateRange(LocalDate startDate, LocalDate endDate) {
QueryWrapper queryWrapper = new QueryWrapper<>();
// 直接使用 between 方法
queryWrapper.between("order_date", startDate.atStartOfDay(), endDate.atTime(23, 59, 59));
return orderMapper.selectList(queryWrapper);
}
方法三:自定义 SQL 片段
如果需要更复杂的逻辑,可以编写自定义的 SQL 片段,并通过 apply 方法将其应用到查询中。
示例:
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
public List getOrdersByCustomCondition(LocalDate date) {
QueryWrapper queryWrapper = new QueryWrapper<>();
// 应用自定义 SQL 片段
queryWrapper.apply("DATE(order_date) = {0}",
date.format(DateTimeFormatter.ISO_LOCAL_DATE));
return orderMapper.selectList(queryWrapper);
}
方法四:使用 @TableField 注解(针对实体类)
虽然这不是直接格式化查询的一部分,但如果你希望在实体类级别处理日期格式,可以考虑使用 @TableField 注解,并结合 Java 的 LocalDate 或 LocalDateTime 类型。
示例:
import com.baomidou.mybatisplus.annotation.TableField;
import java.time.LocalDate;
public class Order {
@TableField(fill = FieldFill.INSERT)
private LocalDate orderDate;
// getters and setters
}
然后,在你的服务层或控制器中,你可以将日期对象传递给 QueryWrapper,它会自动处理日期格式。