You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Querydsl传入org.joda.time.LocalDateTime参数查询返回空列表问题排查

排查Querydsl中LocalDateTime参数匹配返回空列表的问题

嘿,我来帮你梳理下这个问题的可能原因和解决办法!

一、核心问题分析:拆分日月年的潜在风险

你当前的代码是把LocalDate的日、月、年分别和LocalDateTime字段的对应部分匹配,这种方式容易因为类型转换、时区差异或Querydsl函数映射问题导致查询条件不生效,进而返回空列表。

二、推荐解决方案:改用日期范围查询

最稳妥的方式是直接匹配日期当天的时间范围,这样能避免拆分字段带来的各种隐式问题:

public BooleanBuilder createFilter() { 
    BooleanBuilder builder = new BooleanBuilder(); 
    ... 
    LocalDate date = dateService.stringToDate(filters.plannedDate);
    // 转换为当天的起始和结束LocalDateTime
    LocalDateTime startOfDay = date.toDateTimeAtStartOfDay();
    LocalDateTime endOfDay = date.toDateTimeAtTime(23, 59, 59, 999);
    
    // 用between匹配当天的所有时间点
    builder.and(QRealizableTask.realizableTask.plannedDate.between(startOfDay, endOfDay));
    ... 
    return builder; 
}

三、排查原代码失效的具体原因

如果你想搞清楚原代码为什么不工作,可以按以下步骤排查:

  1. 检查Querydsl Joda依赖是否正确引入
    确保你的项目中添加了Querydsl对Joda Time的支持依赖(以Maven为例):

    <dependency>
        <groupId>com.querydsl</groupId>
        <artifactId>querydsl-joda</artifactId>
        <version>${querydsl.version}</version>
    </dependency>
    

    没有这个依赖的话,Querydsl可能无法正确解析Joda类型的日期函数。

  2. 验证实体类的日期字段映射
    如果使用Hibernate作为ORM框架,需要确保plannedDate字段正确映射为Joda的LocalDateTime:

    import org.jadira.usertype.dateandtime.joda.PersistentLocalDateTime;
    import org.joda.time.LocalDateTime;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.Table;
    import org.hibernate.annotations.Type;
    import org.hibernate.annotations.TypeDef;
    
    @Entity
    @Table(name = "realizable_task")
    @TypeDef(name = "jodaLocalDateTime", typeClass = PersistentLocalDateTime.class)
    public class RealizableTask {
        @Id
        private Long id;
        
        @Column(name = "planned_date")
        @Type(type = "jodaLocalDateTime")
        private LocalDateTime plannedDate;
        
        // 其他字段和getter/setter
    }
    

    映射错误会导致数据库中的日期值和Java对象的类型不匹配,进而让查询条件失效。

  3. 开启SQL日志查看生成的查询语句
    开启ORM框架的SQL日志,查看Querydsl生成的SQL和参数是否正确:

    • 如果是Spring Boot + Hibernate,在application.properties中添加:
      spring.jpa.show-sql=true
      spring.jpa.properties.hibernate.format_sql=true
      

    查看生成的SQL是否类似:

    SELECT ... FROM realizable_task 
    WHERE extract(day from planned_date) = ? 
      AND extract(month from planned_date) = ? 
      AND extract(year from planned_date) = ?
    

    同时检查参数值是否和你预期的date对象的日、月、年一致。如果参数不对,那问题出在dateService.stringToDate方法的字符串解析上;如果SQL中的函数调用不对,那就是Querydsl的函数映射问题。

内容的提问来源于stack exchange,提问作者Cafeteru_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:15:15