QueryWrapper 格式化日期字段查询

在使用 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,它会自动处理日期格式。

你可能感兴趣的:(spring,boot,mybatis)