使用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; }
三、排查原代码失效的具体原因
如果你想搞清楚原代码为什么不工作,可以按以下步骤排查:
检查Querydsl Joda依赖是否正确引入
确保你的项目中添加了Querydsl对Joda Time的支持依赖(以Maven为例):<dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-joda</artifactId> <version>${querydsl.version}</version> </dependency>没有这个依赖的话,Querydsl可能无法正确解析Joda类型的日期函数。
验证实体类的日期字段映射
如果使用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对象的类型不匹配,进而让查询条件失效。
开启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的函数映射问题。- 如果是Spring Boot + Hibernate,在
内容的提问来源于stack exchange,提问作者Cafeteru_
相关产品推荐
相关产品推荐

